我使用带有ContentControl的MainWindow.xaml进行了导航设置。 Content属性绑定到MainViewModel中的对象属性。
我有一个UserListView.xaml用户控件,它有UserListViewModel.cs和一个UserDetailView.xaml用户控件,它有一个UserDetailViewModel.cs类。
UserListView显示从数据库中提取的用户列表。在此屏幕上,您可以单击每个用户的按钮以在列表中编辑该用户。还有一个用于创建新用户的按钮。每个按钮都会将您带到UserDetail屏幕,您可以在其中编辑,删除或创建新用户。
在创建新用户或删除用户的情况下,当导航回UserListView屏幕时,会实例化一个新的UserListViewModel,这会对数据库进行新的调用以获取刚刚进行的更改。
问题是视图不反映ViewModel的状态。这就像应用程序从第一次实例化时缓存了View。
例如,如果在UserListView中,我单击添加新用户按钮,我将进入UserDetailView,添加新用户的详细信息,单击保存,然后导航回UserListView - 新创建的用户不在视图中。
请注意,我已经调试过,并且可以确认ViewModel具有正确的数据。我正在使用MVVM Light和Fody来处理 INotifyPropertyChanged 。
这与View的缓存有关吗?我已经尝试添加Mode = TwoWay来绑定DataTemplates和ContentControl的绑定而没有运气。
我做了一个测试,我在UserListView上有一个删除按钮,硬编码从数据库中删除特定用户,然后刷新绑定到视图中表的数据库中的用户列表 - 这是有效的好的,行消失了。所以这似乎是一个缓存问题。
请注意,我没有为UserListView和UserDetailView及其ViewModel提供代码片段,因为我认为它不相关。
MainViewModel.xaml
<Window x:Class="WPFApp.MainWindow"
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:WPFApp"
xmlns:vm="clr-namespace:App.Logic;assembly=WPFApp"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd1="http://www.galasoft.ch/mvvmlight"
mc:Ignorable="d"
Title="WPF App" WindowState="Maximized"
DataContext="{Binding Main, Source={StaticResource Locator}}">
<Window.Resources>
<ResourceDictionary>
<DataTemplate DataType="{x:Type vm:UserListViewModel}">
<local:UserListView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:UserDetailViewModel}">
<local:UserDetailView/>
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
<DockPanel>
<ContentControl Content="{Binding SelectedViewModel}"></ContentControl>
</DockPanel>
MainViewModel.cs
public class MainViewModel : ViewModelBase
{
public event PropertyChangedEventHandler PropertyChanged;
public object SelectedViewModel { get; set; }
public MainViewModel()
{
SelectedViewModel = new HomeViewModel();
}
public RelayCommand HomeNavigationCommand => new RelayCommand(HomeNavigate);
private void HomeNavigate() => Navigate(new HomeViewModel());
public RelayCommand UserListNavigationCommand => new RelayCommand(UserListNavigate);
private void UserListNavigate() => Navigate(new UserListViewModel());
private void UserDetailNavigate(UserDetailUserMessage user) => Navigate(new UserDetailViewModel(user));
private void Navigate(object viewModel)
{
SelectedViewModel = viewModel;
}
}