Проблема в том, что вы используете индексатор , а не обычное свойство .Хотя подсистема привязки поддерживает индексаторы, MVVMLight и INotifyPropertyChanged
нет.
Если вы хотите использовать индексатор, вам необходимо:
- Использовать коллекциюбазовый класс, такой как
ObservableCollection<T>
- Реализация
INotifiyCollectionChanged
и повышение этого события вместо
Первый вариант нереалистичен, поскольку вы уже производны отViewModelBase
и должен продолжать это делать.Поскольку реализация INotifiyCollectionChanged
- это небольшая работа, самый простой подход заключается в следующем:
- добавить свойство к
RadioButtonSwitch
, которое является наблюдаемым набором логических значений (ObservableCollection<bool>
)
Затем измените свою привязку, чтобы добавить еще один элемент пути, и все готово.
Редактировать:
На основании вашего комментария и перечитав ваш вопрос,Я думаю, что реализация INotifyCollectionChanged
является самой простой.Вот переписывание вашего RadioButtonSwitch
класса, который на самом деле больше не нужно наследовать от базового класса MVVMLight , хотя вы все равно можете, если хотите.
Внимательный читатель заметит, чтомы используем кувалду и «сбрасываем» всю коллекцию при изменении любого элемента коллекции.Это не просто лень;это потому, что индексатор использует строковый индекс вместо целочисленного индекса, а INotifyCollectionChanged
не поддерживает это.В результате, когда что-то меняется, мы просто поднимаем руки и говорим, что вся коллекция изменилась.
public class RadioButtonSwitch : INotifyCollectionChanged
{
public event NotifyCollectionChangedEventHandler CollectionChanged;
protected void RaiseCollectionChanged()
{
if (CollectionChanged != null)
CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
IDictionary<string, bool> _options;
public RadioButtonSwitch(IDictionary<string, bool> options)
{
this._options = options;
}
public bool this[string a]
{
get
{
return _options[a];
}
set
{
if (value)
{
var other = _options.Where(p => p.Key != a).Select(p => p.Key).ToArray();
foreach (string key in other)
_options[key] = false;
_options[a] = true;
RaiseCollectionChanged();
}
else
_options[a] = false;
}
}
}