gpt4 book ai didi

WPF、MVVM 和 ComboBox : when changing to a different viewmodel, ComboBox 使绑定(bind)到 SelectedItem 的属性为空

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

我有一个窗口,它使用 DataTemplates 根据其 Content 属性的类型在 ContentPresenter 中显示不同的 UserControl( View ),该属性绑定(bind)到保存当前 View 模型的属性。这样,通过使用事件更改 viewmodel 属性,我可以方便地进行我需要的基本后退/前进导航。

创建新 View 模型时,会传递对当前 View 模型的引用。回到旧的 View 模型实例对于 CheckBox 控件可以正常工作,但对于我制作的包含 TextBlock 和 ComboBox 的 UserControl 则不行。

问题是,当包含 ComboBox 的 View 被卸载时,ComboBox 的 ItemsSource 被清空,这会触发它清除其 SelectedItem/Text 属性,这些属性由于某种原因仍绑定(bind)到我的 View 模型——从而清除它存储的数据。我不知道如何在适当的时候手动解除绑定(bind)。 (同样,CheckBox 工作得很好。)

我读过其他用户也有同样的问题。对于他们来说,更改 ItemsSource 和 SelectedItem/Text 绑定(bind)的声明顺序,以便将后者的属性放置在前者解决问题之前。但是,就我而言,事实并非如此。其他人也通过忽略空值/空值解决了这个问题,但这在我的情况下不起作用。

我可以通过将有趣的数据复制到一个单独的对象并从中重新加载它来解决这个问题,但是我需要添加代码来触发重新加载数据=要维护的更多数据链接代码。

我还可以避免使用 DataTemplates 并在代码隐藏中手动添加 UserControl,这将允许我在删除 UserControl 之前中断数据绑定(bind)。但这与 MVVM 的观点背道而驰。

我不会修改我非常非 MVVM UserControl 来处理它包含的 ComboBox 上的任何事件来解决这个问题。

更新:

我把这个问题缩小了一点。我重构了代码,以便它根据已设置的 View 模型手动创建和添加 View UserControl。现在仅当我将 View UserControl 的 DataContext 设置为 null 时才会出现此问题。如果我只是在不删除引用的情况下替换 View ,它就不再删除有问题的值。这是一个可用的解决方法,还是会产生内存泄漏等问题?

最佳答案

也许会为更简单的解决方案“敞开心扉”......如果我理解你的问题,它类似于我们过去遇到的问题。在我们的例子中,我们简单地假设在被绑定(bind)属性访问时不可能将特定值设置为 null,因此我们稍微调整了适当的 ViewModel 属性:

public MyItem SelectedItem {
get {
return Model.MyItem;
}
set {
if (value != null) {
// Set and notify if not null
Model.MyItem = value;
OnPropertyChanged("SelectedItem");
}
else // just notify when trying to set to null
OnPropertyChanged("SelectedItem");
}
}

使用这些经过调整的属性,我们能够阻止任何将值设置为 null 的尝试。 , 调用 OnPropertyChanged(..) insead,现有值被 UI 调用。如果需要能够将值设置为 null ,你必须提供一个单独的属性来允许它。

不确定这是否适用于您的问题。
祝你好运。

更新
哦,我看到这可能描述了与“其他人也通过忽略空值/空值来解决问题”相同的方法,这在您的情况下似乎不起作用。但我不明白为什么它不应该。

关于WPF、MVVM 和 ComboBox : when changing to a different viewmodel, ComboBox 使绑定(bind)到 SelectedItem 的属性为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5333190/

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