C# 如何防止ListView在卸载DataTemplate时将ViewModel.SelectedItem设置为null?
我有一个带有ListView的屏幕,其中ItemsSource和SelectedItem绑定到ViewModel中合适的属性 此屏幕是屏幕视图模型的数据模板的一部分。问题是:当我“导航离开”这个屏幕时,视图模型中的C# 如何防止ListView在卸载DataTemplate时将ViewModel.SelectedItem设置为null?,c#,wpf,mvvm,data-binding,datatemplate,C#,Wpf,Mvvm,Data Binding,Datatemplate,我有一个带有ListView的屏幕,其中ItemsSource和SelectedItem绑定到ViewModel中合适的属性 此屏幕是屏幕视图模型的数据模板的一部分。问题是:当我“导航离开”这个屏幕时,视图模型中的SelectedItemproperty被设置为null,这不是我想要的。相反,我需要“记住”选择,这样当我再次导航到该屏幕时,最后选择的项目“仍然”被选中 如果我理解正确的话,问题在于,当DataTemplate卸载(因此视图卸载)时,它会取消选择ListView,并通过双向绑定将其
SelectedItem
property被设置为null,这不是我想要的。相反,我需要“记住”选择,这样当我再次导航到该屏幕时,最后选择的项目“仍然”被选中
如果我理解正确的话,问题在于,当DataTemplate卸载(因此视图卸载)时,它会取消选择ListView,并通过双向绑定将其发送到ViewModel,我想我应该以某种方式避免这种情况
我尝试了以下方法,效果很好,但如果不是完全错误的话,也会感觉很不舒服:
// in TheSelectedItem setter
if (value == null)
return;
有什么建议吗
相关代码如下:
MainWindow.xaml:
<ContentControl Content="{Binding ActiveScreen}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type vm:TheViewModel}">
<vw:TheView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:OtherViewModel}">
<vw:OtherView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:AnotherViewModel}">
<vw:AnotherView/>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
TheView.xaml:
<UserControl.Resources>
<CollectionViewSource
x:Key="TheViewSource"
Source="{Binding TheItems}"
Filter="someFilter"
/>
</UserControl.Resources>
<ListView
ItemsSource="{Binding Source={StaticResource TheViewSource}}"
SelectedItem="{Binding TheSelectedItem, Mode=TwoWay}"
>
ViewModel.xaml:
public ObservableCollection<ItemViewModel> TheItems { get; set; }
public ItemViewModel TheSelectedItem
{
get { return _tsi; }
set
{
_tsi = value;
RaisePropertyChanged(() => TheSelectedItem);
}
}
ItemViewModel _tsi;
公共可观测集合{get;set;}
公共项视图为选定项建模
{
获取{return\u tsi;}
设置
{
_tsi=数值;
RaisePropertyChanged(()=>所选编辑项);
}
}
ItemViewModel_tsi;
如何设置ActiveScreen属性?除非每次导航到ViewModel/OtherViewModel/AnotherViewModel时都创建一个新实例,否则该选择应保持不变。@mm8 ActiveScreen是ViewModelBase类型的INPC属性,并且主视图模型具有该类型的其他属性,这些属性是长期存在的。因此,当我想要更改屏幕时,我将
ActiveScreen
设置为适当的实例,该实例已在主视图模型中实例化。您应该提供问题的可复制示例。请阅读以下内容:。根据您提供的信息,您的问题不可复制。