ObservableCollection绑定到TextBox
c# - 绑定(bind)到ObservableCollection的TextBox无法更新
这个找了好久,百度和Bing都没找到,最后Google的。。。。。。。。。。。
原文 标签 c# wpf xaml binding observablecollection
我有一个绑定到observablecollection的文本框,当我更新元素时(通过拖放触发触发在视图文件中处理的事件),该文本框不会更新其值。但是,数据将被添加到下拉列表中的可观察集合中,并且如果我刷新数据(通过实际选择列表框中的其他项并切换回当前记录),则会显示数据。
我读过:http://updatecontrols.net/doc/tips/common_mistakes_observablecollection,不,我不相信我会覆盖这个收藏!
<StackPanel>
<TextBox Text="{Binding Path=ImageGalleryFilenames, Converter={StaticResource ListToStringWithPipeConverter}}" Height="41" TextWrapping="Wrap" VerticalAlignment="Top"/>
<Button Height="25" Margin="0 2" AllowDrop="True" Drop="HandleGalleryImagesDrop">
<TextBlock Text="Drop Image Files Here"></TextBlock>
</Button>
</StackPanel>
这是我的事件代码,用于处理用户控件在视图文件中的删除。
private void HandleGalleryImagesDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
var filenames = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (var fn in filenames)
{
this.vm.CurrentSelectedProduct.ImageGalleryFilenames.Add(fn);
}
}
}
我添加到集合中的事实不足以更新绑定到observablecollection的文本框的事实,还是我错过了令人眼花obvious乱的明显东西?
最佳答案
本质上,TextBox
不可能知道绑定到Text
的集合已被更新。由于Text
属性不侦听CollectionChanged
事件,因此@Clemens指出,更新ObservableCollection
也会被忽略。
在您的ViewModel中,这是一种实现方法。
private ObservableCollection<ImageGalleryFilename> _imageGalleryFilenames;
public ObservableCollection<ImageGalleryFilename> ImageGalleryFilenames
{
get
{
return _imageGalleryFilenames;
}
set
{
_imageGalleryFilenames= value;
if (_imageGalleryFilenames!= null)
{
_imageGalleryFilenames.CollectionChanged += _imageGalleryFilenames_CollectionChanged;
}
NotifyPropertyChanged("ImageGalleryFilenames");
}
}
private void _imageGalleryFilenames_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
NotifyPropertyChanged("ImageGalleryFilenames");
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
以下是测试绑定数组并更新的代码:
在ViewModel的代码:
//变量定义
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<Byte> DataByte
{
get { return _DataByte; }
set
{
_DataByte = value;
if (_DataByte != null)
{
_DataByte.CollectionChanged += _imageGalleryFilenames_CollectionChanged1;
}
}
}
private void _imageGalleryFilenames_CollectionChanged1(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("DataByte"));
}
}
//转换器
public class DataToString1 : IValueConverter
{
#region IValueConverter 成员
object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((value is ObservableCollection<byte>) && value != null)
{
string va = "";
ObservableCollection<byte> TT = (ObservableCollection<byte>)value;
TT.ToList<byte>().ForEach(t =>
{ va += "0x" + t.ToString("X2") + " "; }
);
return va;
}
return value;
}
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
#endregion
}
View
<Window.Resources>
<local:DataToString1 x:Key="AAAA1"/>
</Window.Resources>
<StackPanel>
<TextBlock Text="{Binding DataByte,Converter={StaticResource AAAA1}}" Background="Orange"/>
</StackPanel>