gpt4 book ai didi

c# - 如何避免多个 View 从同一个 View 模型接收数据

转载 作者:行者123 更新时间:2023-12-03 10:38:00 24 4
gpt4 key购买 nike

我对我的代码的行为有点困惑。我还是 MVVM 领域的新手。

我有命令显示的 NewMessageWindow

    private ICommand newMessageCommand;
public ICommand NewMessageCommand
{
get
{
if (newMessageCommand == null)
newMessageCommand = new RelayCommand(() =>
{
new NewMessageWindow().Show();
});
return newMessageCommand;
}
}

可以有多个 NewMessageWindows,每个都应该有单独的 ViewModel。但是我注意到当我打开多个窗口时,如果我在其中更改某些内容,它会影响所有窗口。例如,当我更改组合框时,所有窗口中的组合框值都会发生变化。

如何避免?如何使用不会相互影响的单独 View 模型打开多个窗口?

正在更改的对象是 可观察集合 必看。

编辑:

这就是 ViewLocator 的样子
    public NewMessageWindowModel NewMessage
{
get
{
return ServiceLocator.Current.GetInstance<NewMessageWindowModel>();
}
}

并在构造函数中
    SimpleIoc.Default.Register<NewMessageWindowModel>();

这是绑定(bind)的样子:
 DataContext="{Binding NewMessage,
Source={StaticResource Locator}}"

我已经解决了问题
 ServiceLocator.Current.GetInstance<NewMessageWindowModel(System.Guid.NewGuid().ToString());

但我读过旧实例被缓存。如何摆脱它们?

最佳答案

SimpleIoC来自 MVVM Light 不会为每个调用创建一个新的虚拟机 ServiceLocator.Current.GetInstance<...>();
你可以从库的作者那里找到每次获取新VM的解释Here

对于你的情况,

我可能只是设置 DataContextNewMessageWindow 的代码隐藏构造函数中比直接在 xaml 中使用类似:

public NewMessageWindow() {
InitializeComponent();
var uniqueKey = System.Guid.NewGuid().ToString();
DataContext = SimpleIoc.Default.GetInstance<NewMessageWindowModel>(uniqueKey);
Closed += (sender, args) => SimpleIoc.Default.Unregister(uniqueKey);
}

这样当 Window关闭后,虚拟机将从缓存中删除。

请注意,这不是唯一的方法,您还有很多其他选择,
  • 您可以将绑定(bind)保留在 DataContext 的 xaml 中。当 Window已关闭,使用 Messenger MVVM Light 中的类向 ViewModelLocator 发送消息删除缓存。
  • 您可以实现 Cleanup() ViewModelLocator 中的函数在出现键时删除缓存。

  • 选择一个你喜欢的实现并使用它或使用类似 Unity 的东西或其他 DI 容器助手来获得对 VM 对象生命周期的更多控制。

    关于c# - 如何避免多个 View 从同一个 View 模型接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17526968/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com