Есть ли MVVM-дружественный способ поменять представления без ненужного запуска преобразователей значений? - PullRequest
0 голосов
/ 17 мая 2010

Я думал, что то, что я делал, было прямо из справочника 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, что вызывает исключения, если я специально не проверю это. Но я получаю и другие странные побочные эффекты.

Это заставляет меня задуматься, а не следует ли мне делать все вручную, например:

  1. Создание каждого представления.
  2. Установите DataContext каждого вида для соответствующей модели вида.
  3. Дайте ContentControl имя и сделайте его публичным.
  4. Обработка события PropertyChanged для окна.
  5. В обработчике событий вручную установите свойство Content ContentControl для соответствующего представления на основе CurrentViewModel (используя операторы if).

Кажется, это работает, но также выглядит очень не элегантно. Я надеюсь, что есть лучший способ.

Не могли бы вы порекомендовать мне лучший способ обработки переключения вида, чтобы преобразователи значений не запускались без необходимости?

Ответы [ 2 ]

1 голос
/ 24 мая 2010

Я решил эту проблему, избавившись от всех классов IValueConverter и IMultiValueConverter и просто используя ViewModel для предоставления всех данных. Оказывается, это требует меньше кода и хлопот и не приносит в жертву ничего, о чем я знаю.

1 голос
/ 17 мая 2010

Вы должны взглянуть на PRISM или любой другой составной каркас пользовательского интерфейса. Prism предоставит вам отличный механизм для подобных вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...