【问题标题】:Keep SelectedItem when toggling between screens在屏幕之间切换时保留 SelectedItem
【发布时间】:2015-12-15 20:02:57
【问题描述】:

我有一个 ShellViewModel,其中包含三个 ViewModel 类型的属性:

  1. 一个公共CurrentScreen 属性;
  2. 两个私有:FirstViewModelSecondViewModel 属性。

FirstViewModel 有一个ObservableCollection<Foo> FooCollection 和一个SelectedFoo 类型为Foo 的属性。它是双向绑定到 View 中的 DataGrid,即 DataTemplate:

<DataGrid x:Name="setupsSensoresDataGrid"           
    ItemsSource="{Binding Source={StaticResource FooCollectionViewSource}}"
    SelectedItem="{Binding SelectedFoo, Mode=TwoWay}">
    ....

问题是,当我在第一个屏幕并选择一个项目时,当我转到第二个屏幕并返回时,选择丢失了。

我想知道在从一个屏幕切换到另一个屏幕时如何保留选择(视觉上和逻辑上)。

在我看来,当视图(一个 DataTemplate)被导航走时,TwoWay 数据绑定正在取消选择 SelectedFoo

【问题讨论】:

  • 可能重复(但 IMO 的解决方案有点不雅):stackoverflow.com/questions/8808076/…
  • 你能提供你的视图模型代码吗?也许您每次更改数据模板时都在实例化一个新的视图模型,因此 重置 SelectedFoo 属性?

标签: wpf mvvm mvvm-light


【解决方案1】:

您的意思是当您的CurrentScreen 更改时,您当前的选择 (SelectedFoo) 会丢失?如果是这样,这通常是 SelectorSelectedItem 属性在其 ItemsSource 属性更改时设置为 null 的结果。

我通常解决此问题的方法是使用于保存选择的支持字段(即在您的情况下为SelectedFoo 的支持字段)static 字段:这应该保留选择(只要因为您不是每次都重新创建视图模型)。

例如:

public Foo SelectedFoo
{
    get
    {
        return _selectedFoo;
    }
    set
    {
        if (_selectedFoo != value)
        {
            _selectedFoo = value;
            // INotifyPropertyChanged event dispatch...
        }
    }
}
static Foo _selectedFoo;

请注意,只有支持字段是 static,属性不必是,尽管它不会有任何区别。

显然,这仅在您在任何给定时间使用视图模型的单个实例(包含属性)时才有效。例如,如果列表中有一堆它们,那么这种技术将不起作用,因为它们都将共享相同的支持字段。

有时,您可能还需要在属性设置器中显式检查 null。换句话说,换行:

if (_selectedFoo != value)

到:

if (value != null && _selectedFoo != value)

我过去曾使用过这种技术的两种变体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多