我有一个ShellViewModel,它包含ViewModel类型的三个属性:
CurrentScreen
财产; FirstViewModel
和SecondViewModel
属性。 FirstViewModel
具有ObservableCollection<Foo> FooCollection
和SelectedFoo
类型Foo
的属性。它与View中的DataGrid双向绑定,它是一个DataTemplate:
<DataGrid x:Name="setupsSensoresDataGrid"
ItemsSource="{Binding Source={StaticResource FooCollectionViewSource}}"
SelectedItem="{Binding SelectedFoo, Mode=TwoWay}">
....
问题是,当我在第一个屏幕并选择一个项目时,当我转到第二个屏幕并返回时,选择将丢失。
我想知道在从一个屏幕切换到另一个屏幕时如何保持选择(视觉上和逻辑上)。
在我看来,当导航View(一个DataTemplate)时,TwoWay数据绑定会取消选择SelectedFoo
。
答案 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)
我过去曾使用过这种技术的两种变体。