ComboBox绑定集合和选定属性

时间:2012-03-15 18:33:00

标签: wpf combobox

为什么不#2有效?(似乎大多数例子都说这样做。)

#1(works)<ComboBox ItemsSource="{Binding Marker.ReadOnlyContentRegions}" 
                                  SelectedItem="{Binding Marker.SelectedRegion}"
                                  SelectedValue="{Binding
                                        Marker.SelectedRegion.UniqueId,    Mode=TwoWay}" 
                                  SelectedValuePath="UniqueId" 
                                  DisplayMemberPath="Label" />

#2(doesn't work)<ComboBox ItemsSource="{Binding Marker.ReadOnlyContentRegions}" 
    SelectedValue="{Binding Marker.SelectedRegion.UniqueId,Mode=TwoWay}" 
    SelectedValuePath="UniqueId" 
    DisplayMemberPath="Label" />

这是包含应该数据绑定的对象的类。 类...

    public CancellableObservableCollection<InvisibleContentMarkerBase>       
        ReadOnlyContentRegions
    {
        get { return
             CancellableObservableCollection<InvisibleContentMarkerBase>)
                         GetValue(ReadOnlyContentRegionsProperty); }
        set { SetValue(ReadOnlyContentRegionsProperty, value); }
    }
    public static readonly DependencyProperty ReadOnlyContentRegionsProperty =
        DependencyProperty.Register("ReadOnlyContentRegions",  
           typeof(CancellableObservableCollection<InvisibleContentMarkerBase>), 
           typeof(TargetedContentMarker), new UIPropertyMetadata(null);

    public InvisibleContentMarkerBase SelectedRegion
    {
        get { return (InvisibleContentMarkerBase)GetValue(SelectedRegionProperty); }
        set { SetValue(SelectedRegionProperty, value); }
    }

    public static readonly DependencyProperty SelectedRegionProperty =
        DependencyProperty.Register("SelectedRegion", 
            typeof(InvisibleContentMarkerBase), typeof(TargetedContentMarker), new 
            UIPropertyMetadata(null));

... //课程结束

1 个答案:

答案 0 :(得分:0)

首先,不要同时设置SelectedItemSelectedValue

它们都设置完全相同的属性,因此当你设置时,只有一个值实际上会被使用

设置SelectedValuePathSelectedValue时,您将按值设置所选项目。 SelectedValuePath告诉WPF集合中对象的哪些属性是Id字段,SelectedValue告诉WPF将所选项目设置为等于SelectedValue的值。

SelectedItem只是告诉WPF选择集合中与SelectedItem对象完全匹配的项目。请注意,此比较是通过引用进行的,因此如果SelectedItem是一个类,它没有指向内存中与ItemsSource中的某个对象完全相同的引用,则它不会评估两个对象相同,不会将项目设置为选定

简而言之,要么摆脱SelectedItem绑定,只使用SelectedValue / SelectedValuePath,要么删除SelectedValue / SelectedValuePath并确保SelectedItem中绑定的对象引用内存中与ItemsSource中的副本完全相同的对象。

如果你真的无法引用该对象,并坚持使用SelectedItem而不是SelectedValue,那么你也可以overwrite the .Equals() on your class所以如果数据相等则返回true,无论是如果内存引用是相同的。我更喜欢避免这种情况,因为这会改变这个类的任何实例的功能,但是想让你知道该选项是可用的。