绑定SelectedItem与SelectedIndex - 我应该何时选择其中一个?

Cla*_*ark 6 c# wpf xaml mvvm

假设您有一个可观察的对象类型Foo集合,并且您有一个用户可以从中选择的自定义ListView.

绑定的数据对象:

// property with getter / setter / INotifyPropertyChanged
ObservableCollection<Foo> MyCollection; 
Run Code Online (Sandbox Code Playgroud)

在XAML中:

<ListView ItemsSource={Binding MyCollection} />
Run Code Online (Sandbox Code Playgroud)

是否更适合绑定到XAML中的SelectedIndex并在数据对象中创建以下内容:

int SelectedIndex { get; set; } // also raising property changed notifications
Foo SelectedObject
{
   get { return MyCollection[SelectedIndex]; }
}
Run Code Online (Sandbox Code Playgroud)

或者创建它并绑定到XAML中的SelectedItem:

Foo SelectedObject { get; set; } // also raising property changed notifications
Run Code Online (Sandbox Code Playgroud)

为什么?

Rac*_*hel 4

这两种情况都是可以接受的,但是您选择哪种通常取决于数据模型的设计,以及哪种方法需要最少的代码才能工作。

我用来确定选择哪一个的一些规则

  1. 如果SelectedObject不能为 null(例如枚举),并且需要默认不选择任何项目,则使用SelectedIndex

  2. 如果SelectedObject可能不考虑列表.Equals()中的任何项目Items,请使用SelectedIndex。这是因为使用SelectedItem比较对象与集合,因此引用比较将返回 false,这将导致您的对象未被选中。Items.Equals()

    当您选择的项目来自与项目列表所在的位置不同时,通常会发生这种情况。例如,一个数据库调用来加载Items列表,而另一个数据库调用则获取包含属性的对象SelectedObject

  3. 如果您只需要引用代码的某一部分SelectedObject或其他部分,请使用该部分。SelectedIndex

  4. 如果您的数据模型已经具有SelectedIndexSelectedObject属性,则使用它。

  5. 如果所有其他条件都相同,我使用SelectedObject属性来绑定SelectedItem属性。

    这是因为对我来说,引用类似的东西SelectedUserSelectedUserIndex在后面的代码中引用更有意义,而且我更喜欢避免在任何时候我想对所选项目执行某些操作时在集合中查找该项目。