La liaison ObservableCollection<> à une zone de texte

J'ai des données venant de retour de service web sous la forme d'un ObservableCollection<string> je veux lier la collection en lecture seule TextBox de sorte que l'utilisateur peut sélectionner et copier les données dans le presse-papiers.

Pour obtenir la collection liée à la propriété Text de la zone de texte, j'ai créé IValueConverter qui convertit la collecte d'une chaîne de texte. Cela semble fonctionner, sauf qu'il ne fonctionne qu'une fois, c'est comme si la liaison ne reconnaît pas les modifications ultérieures de la collection Observable. Voici une application simple qui reproduit le problème, juste pour confirmer la liaison fonctionne correctement j'ai aussi se lier à une "zone de liste'

Est-ce parce que le Texte de liaison simple ne permet pas de gérer les événements de changement de la collection?

Une option serait bien pour moi à gérer la collecte des changements et à propager ces à un Texte bien que la zone de texte est lié, ce qui est bien, mais j'aimerais comprendre pourquoi ce qui me semblait être une évidence solutions ne fonctionne pas comme prévu.

XAML

<Window x:Class="WpfTextBoxBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfTextBoxBinding"
        Title="MainWindow" Height="331" Width="402">
  <StackPanel>
    <StackPanel.Resources>
      <local:EnumarableToTextConverter x:Key="EnumarableToTextConverter" />
    </StackPanel.Resources>
    <TextBox Text="{Binding TextLines, Mode=OneWay, Converter={StaticResource EnumarableToTextConverter}}" Height="100" />
    <ListBox ItemsSource="{Binding TextLines}" Height="100" />
    <Button Click="Button_Click" Content="Add Line" />
  </StackPanel >
</Window>

Code Derrière

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Windows;
using System.Windows.Data;
using System.Globalization;

namespace WpfTextBoxBinding
{
  ///<summary>
  ///Interaction logic for MainWindow.xaml
  ///</summary>
  public partial class MainWindow : Window
  {
    public ObservableCollection<string> TextLines {get;set;}

    public MainWindow()
    {
      DataContext = this;

      TextLines = new ObservableCollection<string>();

      //Add some initial data, this shows that the 
      //TextBox binding works the first time      
      TextLines.Add("First Line");

      InitializeComponent();      
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
      TextLines.Add("Line :" + TextLines.Count);
    }
  }

  public class EnumarableToTextConverter : IValueConverter
  {
    public object Convert(
      object value, Type targetType, 
      object parameter, CultureInfo culture)
    {
      if (value is IEnumerable)
      {
        StringBuilder sb = new StringBuilder();
        foreach (var s in value as IEnumerable)
        {
          sb.AppendLine(s.ToString());
        }
        return sb.ToString();
      }
      return string.Empty;
    }

    public object ConvertBack(
      object value, Type targetType, 
      object parameter, CultureInfo culture)
    {
      throw new NotImplementedException();
    }
  }
}
Vous pourriez avoir besoin d'élever une propriété événement de modification de la zone de texte pour la mise à jour.
merci. J'espérais que les notifications de changement serait propogated à la zone de texte par le biais de la liaison.

OriginalL'auteur Chris Taylor | 2010-12-04