Как получить текст из текстового блока внутри списка и отобразить текст в текстовом поле?Как получить текст из текстового блока внутри списка и отобразить текст в текстовом поле?
То, что я хочу сделать
Во-первых, я хочу, чтобы иметь возможность скопировать текст из TextBlock внутри ListBox
Тогда я хочу, чтобы отобразить текст в текстовом поле
Я попытался используя помощник визуального дерева, но, по-видимому, он не может найти метод «FindName». Есть ли лучший способ достичь этого?
XAML код
<ListBox Name="ChatDialogBox" Height="550" ItemsSource="{Binding Path=Instance.Messages,Source={StaticResource Binder}}" >
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBlock Name="ChatMessage" Text="{Binding Text}" TextWrapping="Wrap" Width="430">
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu Name="ContextMenu" >
<toolkit:MenuItem Name="Copy" Header="Copy" Click="Copy_Click" />
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
</TextBlock>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Код За
private void Copy_Click(object sender, RoutedEventArgs e)
{
ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(ChatDialogBox);
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
TextBlock target = (TextBlock)myDataTemplate.FindName("ChatMessage", myContentPresenter);
}
private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}
Binder Класс
public class Binder : INotifyPropertyChanged
{
static Binder instance = null;
static readonly object padlock = new object();
public Binder()
{
Messages = new ObservableCollection<Message>();
}
public static Binder Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new Binder();
}
return instance;
}
}
}
private ObservableCollection<Message> messages;
public ObservableCollection<Message> Messages
{
get
{
return messages;
}
set
{
if (messages != value)
{
messages = value;
NotifyPropertyChanged("Messages");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
Deployment.Current.Dispatcher.BeginInvoke(() => { PropertyChanged(this, new PropertyChangedEventArgs(info)); });
}
}
}
Сообщение Класс
public class Message
{
public string Text { get; set; }
}
Я пробовал эту var model = (Binder.Instance.Messages ((FrameworkElement) отправитель) .DataContext, но я получаю сообщение об ошибке, говорящее, что «является свойством, но используется как тип», так как мне нужно назначать, когда мой связующее является наблюдаемой коллекцией – Challenger
Каков тип 'Binder.Instance.Messages'? Если это, например,' ObservableCollection', тогда вам нужно написать отправитель '(Message) ((FrameworkElement)) .DataContext' –
Да, это ObservableCollection. Но проблема в том, что я поставил (Message) ((FrameworkElement) отправитель) .DataContex, я получу myapp.Message в текстовом поле –
Challenger