WPF更新绑定到数组中的元素
本文关键字:元素 数组 更新 绑定 WPF | 更新日期: 2023-09-27 18:06:38
我已经找遍了我的小心脏,很有可能我错过了一些重要而明显的东西。
我有一个BitArray和一系列的复选框,这些复选框绑定到数组中的元素,如下所示:
<CheckBox IsChecked="{Binding Permissions[0]}" />
<CheckBox IsChecked="{Binding Permissions[1]}" />
...
<CheckBox IsChecked="{Binding Permissions[5]}" />
它们正确地从该属性中获取值,但是更改复选框似乎并没有触发该属性的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 Text="{Binding NameArray[1], UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
同样,这个TextBox从绑定中获得名称很好,但如果我改变它,它不会击中setter。
这可能完全是一个愚蠢的问题,可能源于严重缺乏理解,所以感谢您的耐心!
我从来没有尝试过这种方法,但我不认为这将工作。因为等待setter触发的属性并不是属性绑定。NameArray和NameArray[i]不一样。
我建议查看ObservableCollection和模板来实现多个复选框。例如,你可以创建一个绑定到ObservableCollection的复选框的水平列表框。
你不会在setter中结束,因为你没有改变NameArray
的值,你改变了数组中特定索引的值,例如NameArray[1]。所以绑定工作了,但你不会在setter中结束。
更好的方法是使用ObservableCollection
并将其绑定到ItemsControl
同样,这个TextBox从绑定中获得名称很好,但如果我改变它,它不会击中setter。
它不需要调用setter:绑定不替换数组,它只是替换数组中的一个元素。如果您检查数组中的值,您将看到它们反映了更改。
它也可以很好地与BitArray
(我刚刚尝试了数组和BitArray
)。
然而,数组(和BitArray)不实现INotifyPropertyChanged
或INotifyCollectionChanged
,所以如果数组中的值有其他绑定,它们不会自动刷新。您需要一个包装器来实现这些接口(例如ObservableCollection<T>
)
不能使用元素索引绑定来设置单个数组元素。您需要拆分集合并设置单个属性:
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("")