Я думал, что то, что я делал, было прямо из справочника Josh Smith MVVM, но, похоже, у меня много проблем с запуском преобразователей значений, когда данные в модели представления не изменились.
Итак, у меня есть ContentControl
, определенный в XAML следующим образом:
<ContentControl Grid.Row="0" Content="{Binding CurrentViewModel}" />
Окно, содержащее это ContentControl
, ссылается на словарь ресурсов, который выглядит примерно так:
<ResourceDictionary ...>
<DataTemplate DataType="{x:Type lib_vm:SetupPanelViewModel}">
<lib_v:SetupPanel />
</DataTemplate>
<DataTemplate DataType="{x:Type lib_vm:InstructionsPanelViewModel}">
<lib_v:InstructionsPanel />
</DataTemplate>
</ResourceDictionary>
Таким образом, в основном два шаблона данных указывают, какое представление показывать с какой моделью представления.
Это переключает представления, как и ожидалось, всякий раз, когда изменяется свойство CurrentViewModel
в модели представления моего окна, но, похоже, также вызывает срабатывание преобразователей значений в представлениях, даже если данные не изменились. Это особая проблема с классами IMultiValueConverter
, потому что значения в массиве value
устанавливаются на DependencyProperty.UnsetValue
, что вызывает исключения, если я специально не проверю это. Но я получаю и другие странные побочные эффекты.
Это заставляет меня задуматься, а не следует ли мне делать все вручную, например:
- Создание каждого представления.
- Установите
DataContext
каждого вида для соответствующей модели вида.
- Дайте
ContentControl
имя и сделайте его публичным.
- Обработка события
PropertyChanged
для окна.
- В обработчике событий вручную установите свойство
Content
ContentControl
для соответствующего представления на основе CurrentViewModel
(используя операторы if
).
Кажется, это работает, но также выглядит очень не элегантно. Я надеюсь, что есть лучший способ.
Не могли бы вы порекомендовать мне лучший способ обработки переключения вида, чтобы преобразователи значений не запускались без необходимости?