Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止ListView在卸载DataTemplate时将ViewModel.SelectedItem设置为null?_C#_Wpf_Mvvm_Data Binding_Datatemplate - Fatal编程技术网

C# 如何防止ListView在卸载DataTemplate时将ViewModel.SelectedItem设置为null?

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,并通过双向绑定将其

我有一个带有ListView的屏幕,其中ItemsSource和SelectedItem绑定到ViewModel中合适的属性

此屏幕是屏幕视图模型的数据模板的一部分。问题是:当我“导航离开”这个屏幕时,视图模型中的
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
设置为适当的实例,该实例已在主视图模型中实例化。您应该提供问题的可复制示例。请阅读以下内容:。根据您提供的信息,您的问题不可复制。