J'ai des données revenant du service Web sous la forme d'un ObservableCollection<string>
Je veux lier la collection à un TextBox
en lecture seule afin que l'utilisateur puisse sélectionner et copier les données dans le presse-papiers.Liaison ObservableCollection <> à un TextBox
Pour obtenir la collection liée à la propriété Text de la zone de texte, j'ai créé IValueConverter
qui convertit la collection en une chaîne de texte. Cela semble fonctionner, sauf que cela ne fonctionne qu'une seule fois, c'est comme si la liaison ne reconnaissait pas les modifications ultérieures de la collection Observable. Voici une application simple qui reproduit le problème, juste pour confirmer que la liaison fonctionne correctement. Je lie également à un ListBox
Est-ce parce que la liaison de texte simple ne gère pas les événements de changement de la collection? Une option serait bien sûr pour moi de gérer les changements de collection et de les propager à une propriété Text à laquelle le TextBox est lié, ce qui est bien, mais je voudrais comprendre pourquoi ce qui me semblait être une évidence les solutions ne fonctionnent 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 devrez peut-être déclencher un événement de modification de propriété pour la zone de texte à mettre à jour. – ChrisF
@ChrisF, merci. J'espérais que les notifications de changement seraient propagées au TextBox via la liaison. –