WPF更新绑定到数组中的元素

我搜索了我的小心脏,完全有可能我错过了一些关键且明显的东西。

我有一个BitArray和一系列绑定到数组中元素的复选框,如下所示:

  ...  

他们正确地从该属性获取其值,但更改复选框似乎不会触发该属性的setter。

我尝试了一个非常简单的例子,其中一个TextBox绑定到一个字符串数组的元素。

 class TestArray { private string[] _nameArray = new string[3]; public TestArray() { _nameArray[1] = "test name"; } public string[] NameArray { get { return _nameArray; } set { _nameArray = value; } } } 

这是UI元素:

  

同样,这个TextBox从绑定中获取名称就好了,但是如果我改变它就不会击中setter。

这可能完全是一个傻瓜问题,可能源于严重缺乏理解,所以感谢您的耐心等待!

我以前从未尝试过这种方法,但我认为这不会起作用。 因为您正在等待查看setter fire的属性不是属性绑定。 NameArray与NameArray [i]不同。

我建议查看ObservableCollection和模板来实现多个复选框。 例如,您可以创建一个绑定到ObservableCollection的复选框的水平列表框。

您不会在setter中结束,因为您没有更改NameArray的值,您更改了数组中特定索引的值,例如NameArray [1]。 所以绑定有效,但你不会在setter中结束。

更好的方法是使用ObservableCollection并将其绑定到ItemsControl

同样,这个TextBox从绑定中获取名称就好了,但是如果我改变它就不会击中setter。

它不需要调用setter:绑定不替换数组,它只是替换数组的元素。 如果检查数组中的值,您将看到它们反映了更改。

它也适用于BitArray (我只是尝试使用数组和BitArray )。

但是,数组(和BitArray)不实现INotifyPropertyChangedINotifyCollectionChanged ,因此如果数组中的值存在其他绑定,则不会自动刷新它们。 您将需要一个实现这些接口的包装器(例如ObservableCollection

您将无法使用元素索引绑定设置单个数组元素。 您需要拆分集合并设置单个属性:

 class TestArray : INotifyPropertyChanged { private string[] _nameArray = new string[3]; public TestArray() { _nameArray[1] = "test name"; } public string Name { get { return _nameArray[0]; } set { _nameArray[0] = value; NotifyPropertyChanged("Name"); } } } 

您需要根据MSDN(http://msdn.microsoft.com/en-us/library/ms743695.aspx)使用INotifyPropertyChanged。

缺少的是通知值已更改。 绑定到标准.NET属性(所谓的CLR属性)时,需要触发其他事件以通知控件有关值更改的信息。 看看这个SO问题 。 此外, MSDN可能会有所帮助。

我还建议首先阅读一些WPF基本概念。 像WPF in Action(稍微过时)或WPF Unleashed这样的书可能有所帮助。

这对我有用:

 NotifyPropertyChanged("")