我有一个在 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/