Рассматривали ли вы внедрение своего представления в ViewModel с использованием интерфейса для поддержания разделения?Я знаю, что это нарушает MVVM, но я успешно использовал это в ряде проектов WPF.Я называю это MiVVM или модель с интерфейсом для просмотра ViewModel .
Шаблон прост.Ваш Usercontrol должен иметь интерфейс, назовите его IView.Затем в 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 с присоединенным свойством, если вы используете сторонний контроль.