C# WPF MVVM子视图模型属性未更新视图
因此,我有一个WPF应用程序,它利用MVVM模式,使用MVVM Light库对于INotifyPropertyChanged,我使用的是迄今为止运行良好的Fody.Weavers库。 我有一个MainWindow.xaml,它有一个ContentControl,它的内容属性绑定到它的视图模型上的一个属性以进行导航。这也很有效 MainWindow.xaml:C# WPF MVVM子视图模型属性未更新视图,c#,.net,wpf,xaml,mvvm,C#,.net,Wpf,Xaml,Mvvm,因此,我有一个WPF应用程序,它利用MVVM模式,使用MVVM Light库对于INotifyPropertyChanged,我使用的是迄今为止运行良好的Fody.Weavers库。 我有一个MainWindow.xaml,它有一个ContentControl,它的内容属性绑定到它的视图模型上的一个属性以进行导航。这也很有效 MainWindow.xaml: <ContentControl Content="{Binding SelectedViewModel}"></Cont
<ContentControl Content="{Binding SelectedViewModel}"></ContentControl>
<Window DataContext="{Binding Main, Source={StaticResource Locator}}">
编辑:
MVVM Light有一个ViewModelLocator.cs类,您需要在其中声明每个ViewModel:
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<HomeViewModel>();
}
public MainViewModel Main => ServiceLocator.Current.GetInstance<MainViewModel>();
public HomeViewModel Home => ServiceLocator.Current.GetInstance<HomeViewModel>();
public static void Cleanup()
{
// TODO Clear the ViewModels
}
}
公共类ViewModelLocator
{
公共ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default);
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
}
public MainViewModel Main=>ServiceLocator.Current.GetInstance();
public HomeViewModel Home=>ServiceLocator.Current.GetInstance();
公共静态无效清除()
{
//要清除ViewModels,请执行以下操作:
}
}
然后在每个视图中,引用要在中绑定到的视图模型(为简洁起见,简化了标记)
MainWindow.xaml:
<ContentControl Content="{Binding SelectedViewModel}"></ContentControl>
<Window DataContext="{Binding Main, Source={StaticResource Locator}}">
Home.xaml:
<Button Content="Test" IsEnabled="{Binding CanAccessTestButton}"/>
<UserControl DataContext="{Binding Home, Source={StaticResource Locator}}">
启动时,HomeViewModel构造函数会被调用两次,首先从ViewModelLocator.cs调用,然后再从MainViewModel.cs调用。可能ViewModelLocator引用了我在屏幕上看到的视图。关于如何实现我希望实现的目标有什么想法吗
我注意到HomeViewModel
构造函数从ViewModelLocator
调用了一次,然后在MainViewModel
中设置了Content
绑定后再次调用
那是你的问题。您正在创建视图模型的另一个实例并绑定到此实例
从Home.xaml
中的UserControl
中删除DataContext
属性:
<UserControl DataContext="{Binding Home, Source={StaticResource Locator}}">
您希望绑定到您自己创建的HomeViewModel
实例,而不是视图模型定位器为您创建的实例。因此,这里不需要任何视图模型定位器
我注意到HomeViewModel
构造函数从ViewModelLocator
调用了一次,然后在MainViewModel
中设置了Content
绑定后再次调用
那是你的问题。您正在创建视图模型的另一个实例并绑定到此实例
从Home.xaml
中的UserControl
中删除DataContext
属性:
<UserControl DataContext="{Binding Home, Source={StaticResource Locator}}">
您希望绑定到您自己创建的
HomeViewModel
实例,而不是视图模型定位器为您创建的实例。因此,此处不需要任何视图模型定位器。您从未引发PropertyChanged eventFody。Weavers在后台处理此问题。创建了多少HomeViewModel实例?我将更新我的问题,但我注意到HomeViewModel构造函数从ViewModelLocator调用过一次,然后在设置内容绑定时在MainViewModel中再次执行。这是您的问题。或者至少是其中一个。请看我的答案。您从未引发PropertyChanged eventFody。Weavers在后台处理此问题。创建了多少HomeViewModel实例?我将更新我的问题,但我注意到HomeViewModel构造函数从ViewModelLocator调用了一次,然后在设置内容绑定时在MainViewModel中再次执行。这是您的问题。或者至少是其中一个。请看我的答案,它成功了!好极了虽然我不知道HomeViewModel现在是如何绑定到Home.xaml的。但它仍然有效。谢谢:-)它从ContentControl继承了DataContext。是的,但是ContentControl的DataContext设置为HomeViewModel,它如何知道Home.xaml是它的视图?我还有大约10个其他视图和视图模型。和以前一样:)这方面没有任何变化。我显然不知道如何将视图模型与相应的视图关联起来。但是如果你有其他问题,请问一个新问题。它成功了!好极了虽然我不知道HomeViewModel现在是如何绑定到Home.xaml的。但它仍然有效。谢谢:-)它从ContentControl继承了DataContext。是的,但是ContentControl的DataContext设置为HomeViewModel,它如何知道Home.xaml是它的视图?我还有大约10个其他视图和视图模型。和以前一样:)这方面没有任何变化。我显然不知道如何将视图模型与相应的视图关联起来。但是如果你有其他问题,请问一个新问题。