ComboBox绑定到引用(相对)源

时间:2015-11-25 10:13:09

标签: c# wpf binding combobox relative

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(); }
}

SourceType

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();
    }
}

Item

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

发生以下情况:

  • 仅针对一个来源(如果Source永不改变),则有效:ComboBox显示Items列表并选择了正确的项目(切换时我可以看到Name视图);
  • 对于多个项目ComboBox错误:没有选择(但下拉列表已存在且工作正常),切换视图或更改Source时选择不会保留(例如, 2来源)。

似乎ComboBox在识别SelectedValue或在ItemsSource中找到它时遇到一些问题。我无法弄清楚出了什么问题。

调试无法发现任何内容:Items设置正确,SelectedItem是来自Items集合的第一个项,但ComboBox未显示选择。为什么呢?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

@Giangregorio答案很好并且工作一般,但现在我记得为什么我首先使用SelectedValue

只要SelectedValue 包含ItemsSource

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

我必须首先声明ItemsSource绑定,然后SelectedValue秒声明

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

有效!

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