我目前正在尝试使用MVVM处理多个视图和视图模型,并且设法设置了默认视图,并且我想在单击绑定到命令的按钮时更改视图。
该命令将触发并执行应替换视图的代码,但由于某种原因,它不是,而且我不知道为什么。
所以我的MainWindows.xaml看起来像这样
<Grid Column="0"
Background="Gray">
<StackPanel>
<Button Height="50"
Content="Home"/>
<Button Height="50"
Content="Add"
Command="{Binding DisplayAddViewCommand}"/>
</StackPanel>
</Grid>
<ContentControl Grid.Column="1"
Content="{Binding CurrentView}"/>
如您所见,有两个按钮和一个ContentControl绑定到属性CurrentView
我还将窗口的DataContext设置为BaseViewModel
<Window.DataContext>
<viewModels:BaseViewModel/>
</Window.DataContext>
如果我们看一下BaseViewModel,我们可以看到CorrentView在构造函数中被设置为HomeVM,这很好,它从HomeView开始,但是当我单击绑定到您看到的命令的按钮时在那里,它触发了CurrentView = AddVM
,但实际上并没有改变视图,也没有更新视图。
public class BaseViewModel : ObservableObject
{
public RelayCommand DisplayAddViewCommand { get; set; }
public object CurrentView { get; set; }
public HomeViewModel HomeVM { get; set; }
public AddViewModel AddVM { get; set; }
public BaseViewModel()
{
HomeVM = new HomeViewModel();
AddVM = new AddViewModel();
CurrentView = HomeVM;
DisplayAddViewCommand = new RelayCommand(o => DisplayAdd(), o => true);
}
public void DisplayAdd()
{
CurrentView = AddVM;
}
}
这是我显示模型的方式
<Application.Resources>
<DataTemplate DataType="{x:Type viewModels:HomeViewModel}">
<views:HomeView/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModels:AddViewModel}">
<views:AddView/>
</DataTemplate>
</Application.Resources>
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
命令本身没有错,因为它命中了断点,而我已经逐步执行了,并且对象继承自的ObservableObject也很好。