WPF структура для выбора usercontrol - PullRequest
0 голосов
/ 31 марта 2020

У меня новый проект WPF (. net core). У меня есть главное окно, в котором есть меню и строка состояния. DataContext - это модель представления, которая выполняет всю логику c. Тело главного окна - это управление контентом, в котором я переключаю различные пользовательские элементы управления на основе выполняемой операции. Пока все хорошо ... Я буду sh вызывать команду в модели представления при выборе пункта меню. Проблема в том, как мне получить доступ к MyContentControl в главном окне из модели представления? Я знаю, что ссылаться на представление из виртуальной машины не рекомендуется, но мне нужно загрузить другой пользовательский интерфейс в ответ на различные варианты меню.

Примером этого может быть отображение EditPersonControl, когда пользователь выбирает EditPerson в меню просмотра.

TIA

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

То, что вы хотите сделать, называется отображением местоположения - это достигается без обращения к представлению из виртуальной машины.

Кратчайшим способом было бы иметь свойство наподобие BaseViewModel CurrentViewModel {get;set;} (сеттер должен вызывать свойство измененное событие) в viewModel позади вашего главного окна.

Эта логика только для ViewModel c должна выбирать другие модели представления для отображения, помещая их в CurrentViewModel. Вы также можете заменить это навигационной службой вашей фреймворк

(Если вы ее не используете, вам не хватает времени)

Затем вы можете настроить управление контентом следующим образом:

 <ContentControl Content="{Binding CurrentViewModel}">
<ContentControl.Resources>
    <DataTemplate DataType="{x:Type viewModels:FirstViewModel}">
        <views:FirstView ViewModel={Binding}/> 
        <!-- <views:FirstView DataContext={Binding}/>  -->
        <!-- The first method is preferable -->
    </DataTemplate>

    <DataTemplate DataType="{x:Type viewModels:SecondViewModel}">
        <views:SecondView ViewModel={Binding}/> 
    </DataTemplate>

     <DataTemplate DataType="{x:Type viewModels:AnotherViewModel}">
            <views:AnotherView ViewModel={Binding}/> 
        </DataTemplate>
    <ContentControl.Resources>
  </ContentControl>

Я надеюсь, что вы можете увидеть шаблон здесь - элемент управления выберет правильный шаблон на основе указанного типа c, который вы указали в CurrentViewModel. Вы также можете поместить эти шаблоны в app.xaml в App.Resources, и тогда все ContentTemplates и ItemTemplates будут использовать их автоматически. В этом случае вы можете при необходимости перезаписать их локально в ресурсах каждого элемента управления.

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

Поскольку это очень утомительно, у нас есть рамки. Я использовал только ReactiveUI , который способен автоматически находить все представления, но я уверен, что другие платформы также поддерживают эту концепцию.

0 голосов
/ 01 апреля 2020

Я нашел способ сделать это, не нарушая целостность модели. Я добавил свойство в ВМ, чтобы удерживать отображаемый пользовательский элемент управления, а затем связал «{Binding BodyContentProperty}»

Представление остается независимым. ВМ не знает о представлении. Я думаю, что это приемлемо.

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