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

Dan*_*ler 7 .net c# wpf mvvm

我有一个应用程序,我在GroupBox中显示UserControls.为了显示控件,我绑定到主窗体的ViewModel中的属性,该属性返回要显示的ViewModel.我已经设置了DataTemplates,以便表单自动知道用于显示每个ViewModel的UserControl/View.

当我显示不同的UserControl时,我保持前一个控件的ViewModel处于活动状态,但WPF会自动丢弃视图.

我遇到的问题是,当视图关闭时,任何对ViewModel中属性的双向绑定都会立即设置为null,因此当我再次显示ViewModel时,所有值都只是在UI.

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

DataTemplates在我的资源中

<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>
Run Code Online (Sandbox Code Playgroud)

用于显示用户控件的代码

<GroupBox>
    <ContentControl  Content="{Binding Path=RightPanel}" />
</GroupBox>
Run Code Online (Sandbox Code Playgroud)

我在其中一个视图中绑定的控件示例:

    <ComboBox Name="SupervisorDropDown" ItemsSource="{Binding Path=Supervisors}" DisplayMemberPath="sgSupervisor" 
           SelectedValuePath="idSupervisor" SelectedValue="{Binding Path=SelectedSupervisorID}" />
Run Code Online (Sandbox Code Playgroud)

以及相关的ViewModel属性:

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

public int? SelectedSupervisorID
{
    get
    {
        return selectedSupervisorID;
    }
    set
    {
        selectedSupervisorID = value;
        this.OnPropertyChanged("SelectedSupervisorID");
    }
}
Run Code Online (Sandbox Code Playgroud)

有关如何停止我的视图的任何想法使我的ViewModel中的值无效?我想也许我需要在关闭之前将View的DataContext设置为null,但我不确定如何以当前绑定的方式来解决这个问题.

Dan*_*ler 0

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

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

因此,当 DataContext 更改时,如果新上下文为 null,那么我将删除 ComboBox 上的相关绑定,如下所示:

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

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

另一种选择可能是重新构建我的应用程序,以便视图在 ViewModel 销毁之前不会被销毁 - 这将完全回避问题。