Переключение на другой вид - PullRequest
0 голосов
/ 06 апреля 2020

я сейчас учусь C# и WPF. Я начал кодировать простое приложение, у меня есть 1 класс модели (Book), 2 вида модели (BookListModelView, AddNewBookModelView) и 2 стенда представлений UserControl (BookListView, AddNewBookView).

Мой вопрос: как я могу перейти на AddNewBookView, если мой текущий вид - BookListView?

MainWindow.xaml:

<ContentControl Grid.Row="1" Grid.Column="1" Content="{Binding}"/>

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        BookListModelView bookListMV = new BookListModelView();
        this.DataContext = bookListMV;
    }
}

BookListView.xaml.cs

public partial class BookListView : UserControl
{
    public BookListView()
    {
        InitializeComponent();
    }

    private void NewBookBtn_Click(object sender, RoutedEventArgs e)
    {
        this.DataContext = new AddNewBookViewModel();
    }
}

Спасибо за ваши ответы!

1 Ответ

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

Обычный способ добиться этого - использовать DataTemplates. В основном у вас есть свойство в модели основного представления, содержащее модели представления вашей дочерней страницы:

public object PageViewModel {get; set;} // <--- needs property change notification

Я использовал object в качестве типа здесь, тогда как на практике у вас обычно есть некоторый базовый класс для ваши страницы.

В вашем представлении вы создаете ContentControl и привязываете его к этому свойству:

<ContentControl Content="{Binding PageViewModel}" />

Наконец, вам нужно указать какое-то отображение, указывающее, какое представление отображать для каждого из них. посмотреть тип модели. Вот где появляются шаблоны данных:

<DataTemplate DataType="{x:Type local:ChildViewModel1}">
    <local:ChildViewControl1 />
</DataTemplate>

<DataTemplate DataType="{x:Type local:ChildViewModel2}">
    <local:ChildViewControl2 />
</DataTemplate>

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

<DataTrigger Binding="{Binding PageViewModelProperty}" Value="SomeChildViewModel1Value">
    <Setter Property="Template" Value="{StaticResource MyPageTemplate1}" />
</DataTrigger>

<DataTrigger Binding="{Binding PageViewModelProperty}" Value="SomeChildViewModel2Value">
    <Setter Property="Template" Value="{StaticResource MyPageTemplate2}" />
</DataTrigger>

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

...