c# - WPF View 在关闭时将 ViewModel 属性设置为 null

标签 c# .net wpf mvvm

我有一个在 GroupBox 中显示 UserControl 的应用程序。为了显示控件,我绑定(bind)到主窗体的 ViewModel 中的一个属性,它返回要显示的 ViewModel。我设置了 DataTemplates,以便表单自动知道要使用哪个 UserControl/View 来显示每个 ViewModel。

当我显示不同的 UserControl 时,我会保持前一个控件的 ViewModel 处于事件状态,但 View 会被 WPF 自动丢弃。

我遇到的问题是,当 View 关闭时,ViewModel 中属性的任何两种方式绑定(bind)都立即设置为 null,因此当我再次显示 ViewModel 时,所有值都设置为UI 中为 null。

我认为这是因为作为 View 关闭的一部分,它会处理并清除它包含的控件中的任何值,并且由于绑定(bind)就位,它们也会向下传播到 ViewModel。

我的资源中的数据模板

<DataTemplate DataType="{x:Type vm:HomeViewModel}">
    <vw:HomeView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:SettingsViewModel}">
    <vw:SettingsView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:JobListViewModel}">
    <vw:JobListView />
</DataTemplate>

用于显示用户控件的代码

<GroupBox>
    <ContentControl  Content="{Binding Path=RightPanel}" />
</GroupBox>

我在其中一个 View 中绑定(bind)的控件示例:

    <ComboBox Name="SupervisorDropDown" ItemsSource="{Binding Path=Supervisors}" DisplayMemberPath="sgSupervisor" 
           SelectedValuePath="idSupervisor" SelectedValue="{Binding Path=SelectedSupervisorID}" />

和相关的 ViewModel 属性:

public ObservableCollection<SupervisorsEntity> Supervisors
    {
        get
        {
            return supervisors;
        }
    }

public int? SelectedSupervisorID
{
    get
    {
        return selectedSupervisorID;
    }
    set
    {
        selectedSupervisorID = value;
        this.OnPropertyChanged("SelectedSupervisorID");
    }
}

关于如何阻止我的 View 清空我的 ViewModel 中的值的任何想法?我在想,也许我需要在 View 关闭之前将 View 的 DataContext 设置为 null,但我不确定如何使用当前绑定(bind)的方式来处理它。

最佳答案

我找到了一种可能的解决方案,但我真的不喜欢它。

事实证明,DataContext IS 已经设置为 null,但这没有帮助。它发生在属性设置为 null 之前。似乎正在发生的事情是,在 UserControl/View 处理自身之前数据绑定(bind)没有被删除,因此当控件被删除时,空值会向下传播。

因此,当 DataContext 发生变化时,如果新的上下文为 null,那么我将删除 ComboBox 上的相关绑定(bind),如下所示:

private void UserControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if (e.NewValue == null)
    {
        SupervisorDropDown.ClearValue(ComboBox.SelectedValueProperty);
    }
}

我不太喜欢这种方法,因为这意味着我必须记住为我使用的每个数据绑定(bind)控件执行此操作。如果有一种方法可以让每个 UserControl 在它们关闭时自动删除它们的绑定(bind),那就没问题,但我想不出任何方法来做到这一点。

另一种选择可能是只重构我的应用程序,以便在 ViewModel 被破坏之前 View 不会被破坏 - 这将完全回避问题。

关于c# - WPF View 在关闭时将 ViewModel 属性设置为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1002098/

相关文章:

c# - WPF 依赖属性不起作用

c# - 正则表达式来获取样本的特定部分

.net - .NET WPF应用程序变得不稳定

c# - 如何清除 c#.net 中的控制台?

wpf - 复制粘贴 WPF 窗口出现错误

c# - 无法隐式转换类型 System.Collections.Generic.Dictionary<System.Tuple<int,int,string>, AnonymousType#1>

c# - 从右到左每 N 个元素分隔字符串

c# - 从 int 输入确定回文

.net - 资源图片的绝对UriSource

c# - 源文件 X 在 c# 中的 Windows 系统文件保护下?