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。

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

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

我从来没有尝试过这种方法,但我不认为这将工作。因为等待setter触发的属性并不是属性绑定。NameArray和NameArray[i]不一样。

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

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

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

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

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

它也可以很好地与BitArray(我刚刚尝试了数组和BitArray)。

然而,数组(和BitArray)不实现INotifyPropertyChangedINotifyCollectionChanged,所以如果数组中的值有其他绑定,它们不会自动刷新。您需要一个包装器来实现这些接口(例如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("")