在屏幕

时间:2015-12-15 20:02:57

标签: wpf mvvm mvvm-light

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

  1. 一个公共CurrentScreen财产;
  2. 两个私有:FirstViewModelSecondViewModel属性。
  3. FirstViewModel具有ObservableCollection<Foo> FooCollectionSelectedFoo类型Foo的属性。它与View中的DataGrid双向绑定,它是一个DataTemplate:

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

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

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

    在我看来,当导航View(一个DataTemplate)时,TwoWay数据绑定会取消选择SelectedFoo

1 个答案:

答案 0 :(得分:1)

您的意思是当您的SelectedFoo更改时,您当前的选择(CurrentScreen)是否会丢失?如果是这样,这通常是选择器SelectedItem属性在其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)

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