绑定SelectedItem与SelectedIndex-我什么时候应该选择一个而不是另一个

本文关键字:一个 另一个 选择 SelectedIndex- SelectedItem 什么时候 绑定 | 更新日期: 2023-09-27 18:24:17

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

您的绑定数据对象:

// property with getter / setter / INotifyPropertyChanged
ObservableCollection<Foo> MyCollection; 

在XAML中:

<ListView ItemsSource={Binding MyCollection} />

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

int SelectedIndex { get; set; } // also raising property changed notifications
Foo SelectedObject
{
   get { return MyCollection[SelectedIndex]; }
}

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

Foo SelectedObject { get; set; } // also raising property changed notifications

为什么?

绑定SelectedItem与SelectedIndex-我什么时候应该选择一个而不是另一个

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

我用一些规则来决定选择

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

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

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

  3. 如果在代码的其他部分中只需要引用SelectedObjectSelectedIndex中的一个,请使用该部分。

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

  5. 如果所有其他东西都相等,我使用SelectedObject属性来绑定SelectedItem属性。

    这是因为对我来说,在后面的代码中引用类似SelectedUser而不是SelectedUserIndex的东西更有意义,而且我更喜欢在任何时候都避免在集合中查找所选项目。

取决于您的需求。如果您需要设置所选项目,则需要第二个版本。如果您需要所选项目的索引,则需要第一个版本。如果你两者都不需要,那就取决于你个人的喜好。

这两种方法都很好。使用你觉得更容易使用的。我发现自己并不经常依赖指数,但你的情况可能会有所不同。

例如,如果您查看MVVM库,Caliburn.Micro希望您使用SelectedObject方法。它明确支持这一公约。

并注意集合属性。一般来说,最好有只读的自动属性,并在构造函数中设置它们(不需要属性更改通知)。不建议更改集合的实例。虽然WPF支持它,但如果实例不变,那么在自己的代码中订阅集合事件会容易得多。

我个人认为绑定到SelectedObject要干净得多,除非您需要访问SelectedIndex

我唯一一次使用SelectedIndex是当我想设置默认值0来选择第一个项目时。