【发布时间】:2013-07-08 12:44:21
【问题描述】:
我对我的代码的行为有点困惑。我还是 MVVM 领域的新手。
我有命令显示的 NewMessageWindow
private ICommand newMessageCommand;
public ICommand NewMessageCommand
{
get
{
if (newMessageCommand == null)
newMessageCommand = new RelayCommand(() =>
{
new NewMessageWindow().Show();
});
return newMessageCommand;
}
}
可以有多个 NewMessageWindows,每个都应该有单独的 ViewModel。但是我注意到当我打开多个窗口时,如果我在其中更改某些内容,它会影响所有窗口。例如,当我更改组合框时,所有窗口中的组合框值都会发生变化。
如何避免?如何使用不会相互影响的单独视图模型打开多个窗口?
正在改变的对象是绑定到视图的ObservableCollections。
编辑:
这就是 ViewLocator 的样子
public NewMessageWindowModel NewMessage
{
get
{
return ServiceLocator.Current.GetInstance<NewMessageWindowModel>();
}
}
在构造函数中
SimpleIoc.Default.Register<NewMessageWindowModel>();
这是绑定的样子:
DataContext="{Binding NewMessage,
Source={StaticResource Locator}}"
我已经解决了问题
ServiceLocator.Current.GetInstance<NewMessageWindowModel(System.Guid.NewGuid().ToString());
但我读过旧实例已被缓存。如何摆脱它们?
【问题讨论】:
-
每个视图都有自己的视图模型吗?如果视图都具有相同的视图模型,那么您的 INofifyPropertyChanged(或类似的 MVVM 实现)将通知所有窗口并进行相应更改。
-
如何查看?他们都在扩展
ViewModelBase -
没有看到更多代码很难说;我假设您的视图是 XAML 窗口,您是否将每个数据上下文设置为不同视图模型的数据上下文?
-
那么您在哪里为
NewMessageWindow创建虚拟机?您可以在此处检查它是否确实为每个 View 实例创建了新的虚拟机 -
它们是 xaml 窗口这是我设置 dataContext
DataContext="{Binding NewMessage, Source={StaticResource Locator}}"
标签: c# .net wpf mvvm mvvm-light