Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF MVVM子视图模型属性未更新视图_C#_.net_Wpf_Xaml_Mvvm - Fatal编程技术网

C# WPF MVVM子视图模型属性未更新视图

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

因此,我有一个WPF应用程序,它利用MVVM模式,使用MVVM Light库对于INotifyPropertyChanged,我使用的是迄今为止运行良好的Fody.Weavers库。

我有一个MainWindow.xaml,它有一个ContentControl,它的内容属性绑定到它的视图模型上的一个属性以进行导航。这也很有效

MainWindow.xaml:

<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个其他视图和视图模型。和以前一样:)这方面没有任何变化。我显然不知道如何将视图模型与相应的视图关联起来。但是如果你有其他问题,请问一个新问题。