我有一个应用程序,在GroupBox中显示UserControl。为了显示控件,我绑定到主窗体的ViewModel中的属性,该属性返回要显示的ViewModel。我设置了DataTemplates,以便表单自动知道要使用哪个UserControl / View来显示每个ViewModel。
当我显示不同的UserControl时,我保持先前控件的ViewModel处于活动状态,但是Views会被WPF自动丢弃。
我的问题在于,当视图关闭时,与ViewModel中属性的双向绑定立即设置为null,因此当我再次显示ViewModel时,所有值都在UI中设置为null。
我认为这是因为作为View关闭的一部分,它会处理并清除其包含的控件中的任何值,并且由于绑定已经就位,它们也会传播到ViewModel中。
我的资源中有DataTemplates。
当我显示不同的UserControl时,我保持先前控件的ViewModel处于活动状态,但是Views会被WPF自动丢弃。
我的问题在于,当视图关闭时,与ViewModel中属性的双向绑定立即设置为null,因此当我再次显示ViewModel时,所有值都在UI中设置为null。
我认为这是因为作为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>
用于显示用户控件的代码
<GroupBox>
<ContentControl Content="{Binding Path=RightPanel}" />
</GroupBox>
以下是我在一个视图中绑定的控件示例:
<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");
}
}
您有没有想过如何防止视图将ViewModels中的值设置为null?我认为,也许需要在视图关闭之前将其DataContext设置为null,但是目前的绑定方式让我不确定该如何操作。