导航回视图时WPF ContentControl不更新

时间:2017-06-24 04:25:07

标签: wpf mvvm mvvm-light contentcontrol fody-propertychanged

我使用带有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;
    }
}

0 个答案:

没有答案