将WPF属性(如IsEnabled)绑定到Dictionary

时间:2016-12-06 16:13:43

标签: c# dictionary mvvm binding

我正在寻找一种方法将我的代码中的许多多余的Binding压缩成一个字典。

在我的ViewModel中,我有一个词典:

 private Dictionary<string, bool> _myDict;
    public Dictionary<string, bool> MyDictionary
    {
        get
        {
            return _myDict;
        }
        set
        {
            _myDict = value;
        }
    }

非常简单。在正面,我希望能够将IsEnabled绑定到字典条目。例如,如果我有KVP ("FirstBorder", false),那么我希望此边框将IsEnabled设置为false

<Border Width="30" Height="25" IsEnabled="{Binding MyDictionary[FirstBorder]}">

这段代码实际上并不起作用 - 我正在寻找能够在字典中指定字符串Key并根据其Value设置属性而必须做的事情。它甚至可能吗?

2 个答案:

答案 0 :(得分:1)

由于各种不同的原因,词典绝对是最糟糕的事情。最好对实现KeyedCollection的自定义类型(集合中的TItem)使用INotifyPropertyChanged。您可以获得使用密钥访问值的好处,以及值更改时的属性更改通知。

如果你真的想成为坏蛋,请在你的KeyedCollection实现上实现INotifyCollectionChanged。这会让他们嫉妒。

答案 1 :(得分:0)

  

我正在寻找能够在字典中指定字符串键并根据其值设置属性而必须执行的操作。它甚至可能吗?

是的,这应该有效:

public partial class MainWindow : Window
{
    private Dictionary<string, bool> _myDict;
    public Dictionary<string, bool> MyDictionary
    {
        get
        {
            return _myDict;
        }
        set
        {
            _myDict = value;
        }
    }

    public MainWindow()
    {
        InitializeComponent();

        _myDict = new Dictionary<string, bool>();
        _myDict.Add("FirstBorder", true);
        DataContext = this;
    }
}



<Button Content="Button" Width="30" Height="25" IsEnabled="{Binding MyDictionary[FirstBorder]}" />

确保具有MyDictionary属性的对象是您尝试启用/禁用的视图中元素的DataContext。

编辑:请注意,当您在运行时动态更新字典中的布尔值时,视图中元素的状态不会动态更新,因为Dictionary类没有实现INotifyPropertyChanged接口并引发更改通知。

如果你想要这个,你需要明确地更新绑定:

_myDict["FirstBorder"] = true;
var be = button.GetBindingExpression(Button.IsEnabledProperty);
if (be != null)
  be.UpdateTarget();

...或绑定到正确实现INotifyPropertyChanged的类。