Wpf ViewModel属性处理

Wpf ViewModel属性处理,wpf,mvvm,binding,mvvm-light,Wpf,Mvvm,Binding,Mvvm Light,关于我的基于MVVM的WPF应用程序,我只想说几句话。我已经定义了MainWindowViewModel: public class MainWindowViewModel : ViewModelBase { ... public ViewModelBase CurrentViewModel {get; set;} ... } 这是my MainWindow.xaml的数据上下文。此属性有自己的模板绑定到特定视图,具体取决于当前包含的“内部”视图模型。此MainW

关于我的基于MVVM的WPF应用程序,我只想说几句话。我已经定义了MainWindowViewModel:

public class MainWindowViewModel : ViewModelBase
{
     ...
     public ViewModelBase CurrentViewModel {get; set;}
     ...
}
这是my MainWindow.xaml的数据上下文。此属性有自己的模板绑定到特定视图,具体取决于当前包含的“内部”视图模型。此MainWindowViewModel正在侦听更改当前视图模型的Mvvm Light Messenger消息。现在是我的问题

我想在那里分配属性为SelectedUser的LoginViewModel。我从另一个ViewModel获取SelectedUser的属性,在这里我执行以下命令:

this.UserSelectedCommand = new RelayCommand(() =>
        {
            LoginViewModel viewModel = new LoginViewModel();
            viewModel.SelectedLogin = this.SelectedUserFromList;

            MessageHelper.SendViewModel(viewModel); //change CurrentViewModel
            viewModel.RaisePropertyChanged("SelectedLogin");
        });
My LoginViewModel.cs已在构造函数中定义SelectedLogin的默认值

因此,在负责显示用户列表的ViewModel中,我选择了一个,我在SelectedUserFromList属性中有这个值,我想使用所选用户返回登录视图。这意味着我想将带有SelectedLogin的新LoginViewModel分配给CurrentViewModel属性表单MainWindowViewModel

在执行UserSelectedCommand之后,我可以看到绑定到LoginViewModel的适当视图,但我在任何地方都有属性的默认值

我想是因为这个

<DataTemplate DataType="{x:Type vm:LoginViewModel}">
    <views:LoginView/>
</DataTemplate>
我在CurrentViewModel中有正确的ViewModel,已更改SelectedLogin,但模板正在再次加载LoginViewModel,所以构造函数设置默认值。我说得对吗?因为我看不出还有其他原因

编辑


好的,现在我确定DataTemplate正在创建LoginViewModel的新实例,这是一个具有默认值的实例。但是现在呢?我用Singleton修复了它,但我不确定这是否是一个好的解决方案。

DataTemplate不会创建任何新实例,它只为特定数据类型的对象应用一个模板。您是否在构造函数中设置了断点并观察调用堆栈,以了解为什么会调用多个断点?在哪里定义了datatemplate?xaml?我找到了一个解决方案-我声明了DataContext和DataTemplate,所以我同时收到了两个ViewModels。