我搜索了我的小心脏,完全有可能我错过了一些关键且明显的东西。
我有一个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。
这可能完全是一个傻瓜问题,可能源于严重缺乏理解,所以感谢您的耐心等待!
答案 0 :(得分:3)
我之前从未尝试过这种方法,但我认为这不会起作用。因为您正在等待查看setter fire的属性不是属性绑定。 NameArray与NameArray [i]不同。
我建议查看ObservableCollection并模板化以实现多个复选框。例如,您可以创建一个水平列表框,其中包含绑定到ObservableCollection的复选框。
答案 1 :(得分:3)
同样,这个TextBox从绑定中获取名称就好了,但是如果我改变它就不会击中setter。
它不需要调用setter:绑定不替换数组,它只是替换数组的元素。如果检查数组中的值,您将看到它们反映了更改。
它也适用于BitArray
(我刚尝试使用数组和BitArray
)。
但是,数组(和BitArray)不实现INotifyPropertyChanged
或INotifyCollectionChanged
,因此如果对数组中的值有其他绑定,则不会自动刷新它们。您将需要一个实现这些接口的包装器(例如ObservableCollection<T>
)
答案 2 :(得分:3)
您不会在setter中结束,因为您没有更改NameArray
的值,您更改了数组中特定索引的值,例如NameArray [1]。所以绑定有效,但你不会在setter中结束。
更好的方法是使用ObservableCollection
并将其绑定到ItemsControl
答案 3 :(得分:1)
您将无法使用元素索引绑定设置单个数组元素。您需要拆分集合并设置单个属性:
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使用INotifyPropertyChanged(http://msdn.microsoft.com/en-us/library/ms743695.aspx)。
答案 4 :(得分:0)
缺少的是值已更改的通知。绑定到标准.NET属性(所谓的CLR属性)时,需要触发其他事件以通知控件有关值更改的信息。看看这个SO Question。此外,MSDN可能会有所帮助。
我还建议先阅读一些WPF基本概念。像WPF in Action (slightly outdated)或WPF Unleashed这样的图书可能有所帮助。
答案 5 :(得分:0)
这对我有用:
NotifyPropertyChanged("")