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

Posted

技术标签:

【中文标题】WPF 更新绑定到数组中的元素【英文标题】:WPF update binding to element in an array 【发布时间】:2011-11-03 01:50:34 【问题描述】:

我已经摸清了自己的小心脏,完全有可能我遗漏了一些重要而明显的东西。

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

<CheckBox IsChecked="Binding Permissions[0]" />
<CheckBox IsChecked="Binding Permissions[1]" />
...
<CheckBox IsChecked="Binding Permissions[5]" />

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

我尝试了一个非常简单的示例,其中将单个 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。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

我认为这是我的下一步行动 - 应该会更好。谢谢!【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

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

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。

【讨论】:

我考虑过,但我不希望数组中的每个元素都有一个属性;这似乎是一种不好的方法。【参考方案5】:

缺少的是值已更改的通知。当您绑定到标准 .NET 属性(所谓的 CLR 属性)时,您需要触发一个附加事件来通知控件值更改。看看这个SO Question。此外MSDN 可能会有所帮助。

我还可以建议先阅读一些 WPF 基本概念。 WPF in Action (slightly outdated) 或 WPF Unleashed 之类的书可能会有所帮助。

【讨论】:

【参考方案6】:

这对我有用:

NotifyPropertyChanged("")

【讨论】:

以上是关于WPF 更新绑定到数组中的元素的主要内容,如果未能解决你的问题,请参考以下文章

WPF 绑定到资源中的元素

WPF绑定到xaml中的多维数组

WPF学习第二十九章 元素绑定——将元素绑定到一起

数据绑定如何避免 WPF 中的递归更新?

WPF学习第三十章 元素绑定——绑定到非元素对象

WPF学习第三十章 元素绑定——绑定到非元素对象