ComboBox绑定到引用的(相对的)源

本文关键字:相对 ComboBox 引用 绑定 | 更新日期: 2023-09-27 18:24:20

ComboBox绑定到引用源时:

<ComboBox SelectedValue="{Binding Source.SelectedItem}"
          ItemsSource="{Binding Source.Items}"
          DisplayMemberPath="Name" />

其中Source

SourceType _source;
public SourceType Source
{
    get { return _source; }
    set { _source = value; OnPropertyChanged(); }
}

CCD_ 3为

public class SourceType: INotifyPropertyChanged
{
    Item _selectedItem;
    public Item SelectedItem
    {
        get { return _selectedItem; }
        set { _selectedItem = value; OnPropertyChanged(); }
    }
    public IReadOnlyList<Item> Items { get; }
    public SourceType(...)
    {
        Items = new List<Items>(...) // **new** list generated from passed arguments
        SelectedItem = Items.First();
    }
}

CCD_ 4为

public class Item: INotifyPropertyChanged
{
    string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; OnPropertyChanged(); }
    }
}

发生以下情况:

  • 仅对一个源(如果Source从未更改)有效:ComboBox显示Items的列表,并且选择了正确的项目(切换视图时我可以看到它的Name
  • 对于多个项目ComboBox错误:没有选择(但下拉列表在那里,工作正常),当切换视图或Source更改时(例如在两个源之间),选择不会持续

ComboBox似乎在识别SelectedValue或在ItemsSource中找到它方面存在一些问题。我也不知道出了什么问题。

调试没有发现任何东西:Items设置正确,SelectedItemItems集合中的第一个项目,但ComboBox未经选择而显示。为什么?

ComboBox绑定到引用的(相对的)源

我将使用ObservableCollection而不是List for Items,并使用SelectedItem作为ComboBox,而不是SelectedValue。

阅读这个伟大的答案,了解SelectedItem和SelectedValue之间的差异SelectedItem、SelectedValue和SelectedValuePath 之间的差异

@Giangregorio的回答很好,总体上有效,但现在我记得我最初为什么使用SelectedValue了。

只要ItemsSource不包含SelectedValueSelectedValue就很有用。如果使用了SelectedItem(根据答案),则绑定将使用null调用setter,就好像用户可以从列表中选择null一样。我正在利用这种情况(以避免使用数据模板和更复杂的ViewModel),所以我必须坚持使用SelectedValue,我认为我在应该工作的情况下找到了问题的原因。

我必须首先声明ItemsSource绑定,其次声明SelectedValue

<ComboBox ItemsSource="{Binding Source.Items}"
      SelectedValue="{Binding Source.SelectedItem}"
      DisplayMemberPath="Name" />

它有效!

听起来像是另一个xaml特定的问题,类似于declare CommandParameter before Command问题。