关于我基于MVVM的WPF应用程序的几句话。我已经定义了MainWindowViewModel:
public class MainWindowViewModel : ViewModelBase
{
...
public ViewModelBase CurrentViewModel {get; set;}
...
}
这是我的MainWindow.xaml的数据上下文。此属性具有绑定到特定View的自己的模板(取决于当前包含的“内部”视图模型)。此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");
});
我的LoginViewModel.cs在构造函数中定义了SelectedLogin的默认值。
所以在ViewModel中负责显示我正在选择的用户列表,我在SelectedUserFromList属性中有这个值,我想回到使用所选用户登录View。这意味着我想将具有SelectedLogin的新LoginViewModel分配给CurrentViewModel属性表单MainWindowViewModel。
执行UserSelectedCommand后,我可以看到绑定到LoginViewModel的正确View,但我有属性的默认值。
我想是因为这个
<DataTemplate DataType="{x:Type vm:LoginViewModel}">
<views:LoginView/>
</DataTemplate>
我在CurrentViewModel中有正确的ViewModel(更改了SelectedLogin),但模板再次加载LoginViewModel(因此构造函数设置默认值)。我对吗?因为我看不出任何其他原因。
修改
好的,现在我确定DataTemplate正在创建LoginViewModel的新实例(这个实例具有默认值)。但现在呢?我用Singleton修复它,但我不确定这是不是很好的解决方案。