为什么不#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));
... //课程结束
答案 0 :(得分:0)
首先,不要同时设置SelectedItem
和SelectedValue
它们都设置完全相同的属性,因此当你设置时,只有一个值实际上会被使用
设置SelectedValuePath
和SelectedValue
时,您将按值设置所选项目。 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,无论是如果内存引用是相同的。我更喜欢避免这种情况,因为这会改变这个类的任何实例的功能,但是想让你知道该选项是可用的。