Связывание свойств WPF, таких как IsEnabled to Dictionary

Я ищу способ сжать много лишних Bindings в моем коде в один словарь.

В моем 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 в словаре и установить свойство на основе его значения. Возможно ли это?

c#,dictionary,mvvm,binding,

0

Ответов: 2


1 принят

Словари - самое худшее, что можно было бы связать по ряду причин. Лучше использовать KeyedCollection для настраиваемого типа ( TItemв коллекции), который реализует INotifyPropertyChanged . Вы получаете преимущества использования ключа для доступа к значению и уведомления об изменении свойств при изменении значения.

И если вы действительно хотите быть badass , реализуйте INotifyCollectionChanged в своей реализации KeyedCollection. Это сделает их ревнивыми.


0

Я ищу то, что мне нужно сделать, чтобы иметь возможность указать строку Key в словаре и установить свойство на основе его значения. Возможно ли это?

Да, это должно работать:

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.

C #, словарь, MVVM, связывание,
Похожие вопросы