Я давно принял способ думать, что Шаблоны были созданы для Человека, а не Человек для шаблонов.Довольно часто вы видите ситуацию, когда MVVM не подходит, и чтобы ее решить, очень умные люди придумали способы обойти это, сохраняя при этом чистый MVVM-вид.
Однако, если вы подписались на мою школу мысли или просто хотите сохранить простоту, другой способ - позволить ViewModel ссылаться на представление;через интерфейс, конечно, или это просто ужасная практика программирования.Теперь возникает вопрос, как получить представление в viewmodel?
простейшим способом было бы сделать это в событии dataContextChanged представления.Однако, если вы хотите попробовать что-то другое, как насчет использования присоединенного свойства или свойства зависимости, чтобы внедрить представление в модель представления?
Я успешно использовал эту технику в ряде проектов WPF и не чувствую себя грязным или каким-то скомпрометированным.Я называю это MiVVM или модель с интерфейсом для просмотра ViewModel .
Шаблон прост.Ваш Usercontrol должен иметь интерфейс, назовите его IMyView.Затем в ViewModel у вас есть свойство с сеттером типа IMyView, скажем,
public IMyView InjectedView { set { _injectedView = value; } }
Затем в представлении вы создаете свойство зависимостей с именем This
public MyUserControl : IMyView
{
public static readonly DependencyProperty ThisProperty =
DependencyProperty.Register("This", typeof(IMyView), typeof(MyUserControl));
public MyUserControl()
{
SetValue(ThisProperty, this);
}
public IMyView This { get { return GetValue(ThisProperty); } set { /* do nothing */ } }
}
наконец, в Xaml вы можете добавить представление непосредственно в ViewModel, используя привязку
<MyUserControl This="{Binding InjectedView, Mode=OneWayToSource}"/>
Попробуйте!Я использовал этот шаблон много раз, и вы получаете интерфейс к представлению, внедренному один раз при запуске.Это означает, что вы поддерживаете разделение (Viewmodel можно протестировать, так как IView можно смоделировать), но вы обошли отсутствие поддержки связывания во многих сторонних элементах управления.Плюс, это быстро.Знаете ли вы, связывание использует отражение?
Существует демонстрационный проект, демонстрирующий этот шаблон на этой ссылке в блоге .Я бы рекомендовал опробовать реализацию MiVVM с присоединенным свойством, если вы используете сторонний элемент управления, который вы не можете изменить.
Наконец, позвольте мне предложить найти лучший инструмент для работы, почти всегда лучший подход к программированию.Если вы выберете правильный «чистый» или «правильный» код, вы часто попадете в стену, где вам придется постоянно менять свой подход.