2012-03-15 3 views
0

# 2가 작동하지 않는 이유는 무엇입니까? (대부분의 예는이를 수행하는 것처럼 보입니다).ComboBox 컬렉션 및 선택된 속성 바인딩

#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

은 제어 클래스 또는 데이터 클래스의'class' 코드입니까? –

답변

0

먼저 말 모두 SelectedItem 및 그들은 모두 동일한 속성을 설정 SelectedValue

, 그래서 둘 다 설정하면 실제로 하나의 값만 사용됩니다

SelectedValuePathSelectedValue을 설정하면 선택한 항목을 값으로 설정하게됩니다. SelectedValuePath은 WPF에게 컬렉션의 개체에 대한 속성이 Id이고, SelectedValue은 WPF에게 선택된 항목을 SelectedValue과 같은 값으로 설정합니다.

SelectedItem은 단순히 SelectedItem 개체와 정확하게 일치하는 컬렉션에서 항목을 선택하도록 WPF에 지시합니다. 이 비교는 참조에 의한 것입니다. 따라서 SelectedItemItemsSource에있는 객체 중 하나와 정확히 동일한 참조를 메모리에서 가리 키지 않는 클래스 인 경우 두 객체를 동일하게 평가하지 않고 ' 짧은 그래서

을 선정, 중 바인딩 및 단지 SelectedValue/ SelectedValuePath를 사용하거나 SelectedValue/ SelectedValuePath를 제거하고 SelectedItem으로 바인드 된 객체로 메모리에 동일한 개체를 참조 있는지 확인 SelectedItem 제거로 t는 항목을 설정 ItemsSource의 사본. 데이터에 관계없이 메모리 참조가 동일한 경우의, 동일한 경우

당신이 정말로 그 객체를 참조하고, 대신 SelectedValueSelectedItem를 사용하여 주장 할 수없는 경우

, 당신은 할 수도 overwrite the .Equals() on your class는 그래서는 true를 돌려줍니다. 나는이 클래스의 모든 인스턴스의 기능을 변경 했으므로이 옵션을 사용하지 않는 것을 선호하지만 옵션을 사용할 수 있음을 알리고 싶습니다.

+0

글쎄, 내가 override하려고하는 Equals를 봉인하는 dependencyobject에서 파생 된 클래스가있다. selectedItem 참조가 내 코드에서 손실되어 selecteed 항목에서도 손실되는 경우가있는 것 같습니다. 따라서, selectedValuePath 및 SelectedValue를 코드에서 제거하면 바인딩이 여전히 작동해야합니다 (selectedItem 객체가 올바른 객체에 대한 참조임을 보장하지는 않지만). – jwize

+0

@jwize 예, WPF는'SelectedValue' 또는'SelectedItem' 중 하나만 사용합니다. 그래서'SelectedValue'를 제거하고'SelectedItem'이'ItemsSource'에 존재하는 객체를 가리 키도록하거나'SelectedItem'을 제거하고'SelectedValue'에 의해 당신의 객체를 설정합니다. – Rachel

+0

파생 된 의존성에 대한 우려에 여전히 답하지 않습니다. 개체, 그래서 난 아직도 붙어있다. 그리고 selectedValue/SelectedValuePath가 없으면 예제가 작동하지 않습니다. 내 바인딩에 문제가있을 수 있습니까? – jwize