【问题标题】:WPF update binding to element in an arrayWPF 更新绑定到数组中的元素
【发布时间】: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。

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

【问题讨论】:

    标签: c# wpf binding


    【解决方案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("")
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-05
            • 2018-07-18
            • 2011-07-21
            • 1970-01-01
            • 2014-11-30
            相关资源
            最近更新 更多