2016-10-30 2 views
0

Я написал код, который должен перемещаться между пользовательскими элементами управления в приложении WPF с помощью MVVM, но я понял, что этот код не работает. Из окна LoginView Я хочу изменить вид на VotingCardView.Навигация с одного вида на другой в WPF MVVM

Фактически, после нажатия на кнопку в LoginView, метод DisplayVCV будет выполнен, но вид не изменится. Что я делаю не так?

MainView.xaml:

<Window x:Class="ElectionCalculator.View.MainView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:ElectionCalculator" 
     xmlns:v="clr-namespace:ElectionCalculator.View" 
     xmlns:vm="clr-namespace:ElectionCalculator.ViewModel" 
     mc:Ignorable="d" 
     Title="Election calculator" Height="350" Width="525"> 
    <Window.DataContext> 
     <vm:MainViewModel /> 
    </Window.DataContext> 
    <ContentControl Content="{Binding ViewModel}" /> 
</Window> 

LoginView.xaml:

<UserControl x:Class="ElectionCalculator.View.LoginView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:ElectionCalculator.View" 
     xmlns:vm="clr-namespace:ElectionCalculator.ViewModel" 

     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 

    <Grid> 
     <Button Command="{Binding DataContext.DisplayVC, RelativeSource={RelativeSource AncestorType={x:Type Window}}, Mode=OneWay}" Margin="161,147,47,124" /> 
    </Grid> 

</UserControl> 

MainViewModel.cs

class MainViewModel : BaseViewModel 
{ 
    public BaseViewModel ViewModel { get; set; } 

    public MainViewModel() 
    { 
     ViewModel = new LoginViewModel(); 
    } 

    public ICommand DisplayVC { get { return new RelayCommand(DisplayVCV); } } 

    public void DisplayVCV() 
    { 
     ViewModel = new VotingCardViewModel(); 

     MessageBox.Show("DisplayVCCommandExecuted"); 
    } 
} 

ответ

3

Ваш ViewModel реализация недвижимости не поднимает PropertyChanged событие, когда значение изменения. Обычно это делается с помощью реализации INotifyPropertyChanged. Из-за этого ваше мнение не получает уведомления о том, что что-то изменилось.

В вашем случае, это означает, что вам нужно поле подкладочного для ViewModel собственности и реализовать ViewModel свойства, похожее на это:

private BaseViewModel _viewModel; 
public BaseViewModel ViewModel 
{ 
    get { return _viewModel; } 
    set 
    { 
    if(_viewModel != value) 
    { 
     _viewModel = value; 
     OnPropertyChanged("ViewModel"); 
    } 
    } 
} 

Поскольку вы уже вытекающие из BaseViewModel Я полагаю, что метод OnPropertyChanged (или какой-то метод с похожим именем). Также довольно часто бывает, что вам не нужно указывать имя свойства ("ViewModel") в качестве аргумента, поскольку для этой цели множество реализаций используют атрибут [CallerMemberName].

 Смежные вопросы

  • Нет связанных вопросов^_^