2013-01-24 1 views
0

DataContext의 속성을 결합하려고에 SelectedItem이 같은 콤보 상자에 :바인딩 양방향이의 selectedItem합니다 : "잘못된 방법"동기화를 초기화

<ComboBox x:Name="ElementSelector" 
      ItemsSource="{Binding Source={StaticResource Elements}}" 
      DisplayMemberPath="ElementName" 
      SelectedItem="{Binding ValueElement, Mode=TwoWay}"> 

요소 자원이 CollectionViewSource입니다 (모르겠다, 이것이 중요한지).

모든 것이 초기화되면 DataContextValueElement 속성이 CollectionViewSource의 첫 번째 항목으로 설정됩니다. 내가 원하는 것은 다른 방법으로 초기화하는 것입니다. 일치하는 항목이 없으면 ComboBox의 SelectedItem을 속성 값으로 설정하고 싶습니다.

어떻게이 작업을 수행 할 수 있습니까?

EDIT - 추가 정보 :

콤보 상자 DataTemplate이 부분이다

<DataTemplate x:Key="ReferenceTemplate" 
       DataType="viewModels:ElementMetaReferenceViewModel"> 
    <StackPanel Orientation="Horizontal"> 
     <StackPanel.Resources> 
     <ResourceDictionary> 
      <views:ElementsForReferenceViewSource x:Key="Elements" 
                Source="{Binding DataContext.CurrentProject.Elements, ElementName=Root}" 
                ReferenceToFilterFor="{Binding}"/> 
     </ResourceDictionary> 
     </StackPanel.Resources> 

     <TextBlock Text="{Binding PropertyName}"/> 
     <ComboBox x:Name="ElementSelector" 
       ItemsSource="{Binding Source={StaticResource Elements}}" 
       DisplayMemberPath="ElementName" 
       SelectedItem=""{Binding ValueElement, Mode=TwoWay}" /> 

    </StackPanel> 
</DataTemplate> 

ElementsForReferenceViewSource 단순히 CollectionViewSource 파생 필터링을 위해 사용되는 추가하는 DependencyProperty를 구현한다.

CollectionViewSource에있는 항목의 DataContext는 다음과 같습니다 : 사람들의

public class ElementMetaReferenceViewModel : ViewModelBase<ElementMetaReference, ElementMetaReferenceContext> 
{ 
    ... 
    private ElementMetaViewModel _valueElement; 

    public ElementMetaViewModel ValueElement 
    { 
     get { return _valueElement; } 
     set 
     { 
      if (value == null) return; 
      _valueElement = value; 
      Model.TargetElement = value.Model; 
     } 
    } 

    ... 
} 
+0

저는 Elements의 구조와 ValueElement 정의가 귀하의 질문에 포함되어 유용하다고 생각합니다. – iltzortz

+0

@iltzortz : 제 질문에 세부 사항을 추가했습니다. 모양을 가져 주셔서 감사합니다! – Marc

답변

0

예상대로

위의 코드가 작동하는 동일한 문제가 발생. 그 해결책은 장면 뒤에서 물건을 얻는 것이 었습니다. 바인딩 할 속성의 값인 ViewModel의 인스턴스가 확실히 CollectionViewSource에 포함되어 있는지 확인하십시오.

제 경우에는 객체 트리가 잘못 직렬화되어 객체가 두 번 인스턴스화되었습니다. 그런 다음 각 객체에 대해 고유 한 ViewModel이 초기화되었으며 속성 값이 목록에 포함되지 않았습니다.)이 같은 콤보 상자에 표시되는 ViewModels의 방법을 있으며, toString (

오버라이드 :

이이 경우에 문제가 있는지 여부를 확인하려면 비고, 다음을 시도 할 수 있습니다

public override string ToString() 
{ 
    return "VM"+ Model.GetHashCode().ToString(); 
} 

그러면 소스 컬렉션의 항목을 속성의 값과 쉽게 비교할 수 있습니다. 가장 전문적인 방법은 아니지만 그것은 나를 위해 일했습니다.