1

Как получить текст из текстового блока внутри списка и отобразить текст в текстовом поле?Как получить текст из текстового блока внутри списка и отобразить текст в текстовом поле?

То, что я хочу сделать

Во-первых, я хочу, чтобы иметь возможность скопировать текст из TextBlock внутри ListBox

enter image description here

Тогда я хочу, чтобы отобразить текст в текстовом поле

enter image description here

Я попытался используя помощник визуального дерева, но, по-видимому, он не может найти метод «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; } 

} 

ответ

1

Там есть и косвенный, но более простой способ извлечения содержимого TextBlock.

В случае щелчка, вы можете получить объект модели, используя DataContext свойства:

private void Copy_Click(object sender, RoutedEventArgs e) 
{ 
    var model = (Message)((FrameworkElement)sender).DataContext; 

    // Display model.Text in your TextBlock 
} 

Просто замените Message по типу объектов вы присвоенные ItemsSource вашего списка.

+0

Я пробовал эту var model = (Binder.Instance.Messages ((FrameworkElement) отправитель) .DataContext, но я получаю сообщение об ошибке, говорящее, что «является свойством, но используется как тип», так как мне нужно назначать, когда мой связующее является наблюдаемой коллекцией – Challenger

+0

Каков тип 'Binder.Instance.Messages'? Если это, например,' ObservableCollection ', тогда вам нужно написать отправитель '(Message) ((FrameworkElement)) .DataContext' –

+0

Да, это ObservableCollection . Но проблема в том, что я поставил (Message) ((FrameworkElement) отправитель) .DataContex, я получу myapp.Message в текстовом поле – Challenger