Tengo datos que regresan del servicio web en forma de ObservableCollection<string>
Quiero vincular la colección a TextBox
de solo lectura para que el usuario pueda seleccionar y copiar los datos en el portapapeles.Vinculable ObservableCollection <> a un TextBox
Para obtener la colección vinculada a la propiedad Text del TextBox Creé IValueConverter
que convierte la colección en una cadena de texto. Esto parece funcionar, excepto que solo funciona una vez, es como si el enlace no reconociera los cambios posteriores a la colección Observable. Aquí hay una aplicación simple que reproduce el problema, solo para confirmar que el enlace funciona correctamente también me enlace a un `ListBox '
¿Esto se debe a que el enlace de texto simple no maneja los eventos de cambio de la colección?
Una opción sería, por supuesto, manejar los cambios de colección y propocionarlos a una propiedad Text a la que está vinculado el TextBox, lo cual está bien, pero me gustaría entender por qué lo que me pareció obvio soluciones no está funcionando como se esperaba.
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>
Código Detrás
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();
}
}
}
Es posible que debas generar un evento de propiedad modificada para que el cuadro de texto se actualice. – ChrisF
@ChrisF, gracias. Esperaba que las notificaciones de cambio se propagaran al TextBox a través del enlace. –