WPF mvvm маршруты - PullRequest
       8

WPF mvvm маршруты

0 голосов
/ 31 августа 2018

Я нахожусь в процессе создания настольного приложения на C # с WPF, но я застрял в моем меню. У меня есть меню левой панели для переключения между функциями.

Я создал одну модель представления с двумя видами, которые должны отображаться в моем главном окне. если я нажимаю на «Мониторинг», представление контента переключается с «Дома» на «Мониторинг», но когда я нахожусь на Мониторинге, если я пытаюсь вернуться на «Домой», это не работает, и я не понимаю, почему.

Под папкой моего проекта

([abc] = папка; - abc = файл):

[PROJECT]   
    [assets]
        - Home.png
        - Stats.png
    [ViewModels]
        - MainWindowViewModel.cs
    [Views]
        - Home.xaml
        - Home.cs
        - Stats.xaml
        - Stats.cs
    - MainWindow.xaml
    - MainWindow.cs
    - App.xaml
    - App.cs
    - App.config

Ниже важная часть моего кода:

MainWindow.xaml

<Window.Resources>
    <DataTemplate x:Key="HomeViewTemplate" DataType="{x:Type viewmodels:MainWindowViewModel}">
        <views:Home DataContext="{Binding}" />
    </DataTemplate>

    <DataTemplate x:Key="StatsViewTemplate" DataType="{x:Type viewmodels:MainWindowViewModel}">
        <views:Stats DataContext="{Binding}" />
    </DataTemplate>
</Window.Resources>

<Grid Grid.Row="0" MouseLeftButtonDown="OpenHome">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="70" />
        <ColumnDefinition Width="1*" />
    </Grid.ColumnDefinitions>

    <Image Source="/assets/home.png" Height="32" Width="32" />
    <Label Content="Home" Grid.Column="1" Foreground="White" FontSize="12" VerticalAlignment="Center" Padding="0,5,5,5" />
</Grid>

<Grid Grid.Row="1" MouseLeftButtonDown="OpenStats">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="70" />
        <ColumnDefinition Width="1*" />
    </Grid.ColumnDefinitions>

    <Image Source="/assets/stats.png" Height="32" Width="32" />
    <Label Content="Monitoring" Grid.Column="1" Foreground="White" FontSize="12" VerticalAlignment="Center" Padding="0,5,5,5" />
</Grid>

<Grid Grid.Row="1">
    <ContentControl Content="{Binding }">
        <ContentControl.Style>
            <Style TargetType="{x:Type ContentControl}">
                <Setter Property="ContentTemplate" Value="{StaticResource HomeViewTemplate}" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Route}" Value="Home">
                        <Setter Property="ContentTemplate" Value="{StaticResource HomeViewTemplate}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Route}" Value="Stats">
                        <Setter Property="ContentTemplate" Value="{StaticResource StatsViewTemplate}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
    </ContentControl>
</Grid>

MainWindow.cs

private MainWindowViewModel MV = new MainWindowViewModel();

public MainWindow()
{
    InitializeComponent();
}

private void OpenHome(object sender, RoutedEventArgs e)
{
    MV.Route = "Home";
    DataContext = MV;
}

private void OpenStats(object sender, RoutedEventArgs e)
{
    MV.Route = "Stats";
    DataContext = MV;
}

ViewModels> MainWindowViewModel.cs

public class MainWindowViewModel
{
    public string Route
    {
        get;
        set;
    }

    public MainWindowViewModel(){}
}

1 Ответ

0 голосов
/ 31 августа 2018

Отправка уведомлений об изменениях свойства Route через реализацию интерфейса INotifyPropertyChanged:

public class MainWindowViewModel : INotifyPropertyChanged
{
    public string _Route;
    public string Route
    {
        get { return _Route; }
        set { _Route = value; OnPropertyChanged("Route"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public MainWindowViewModel(){}
}

Такое уведомление активирует DataTrigger, который, в свою очередь, изменит ContentTemplate

...