2012-05-04 3 views
-1

내가 성공적으로 combobox에 결합 할 수있는 MVVM 엔 패턴을 사용하여 combobox에 관찰 가능한 모음을 결합하고있어하지만 지금은 내가보기에 SelectedItem 속성을 얻을 수있는 방법을 찾고 있어요를 사용하여 WPF 콤보 상자의 selectedItem 속성을 가져옵니다 모델 (패턴을 제동 할 수 있기 때문에 단순히 호출 할 수는 없습니다.) 그림을 그리는 방법은 선택된 항목을 가리키며 나중에 뷰 모델에서 사용할 수있는 XAML에 바인딩을 만드는 방법이 있어야한다는 것입니다. 내가 알아낼 수없는 것은 어떻게 ...MVVM 패턴

나는 이것을 어떻게 달성 할 수 있을지에 대한 제안은 무엇입니까?

XAML

<ComboBox SelectedIndex="0" DisplayMemberPath="Text" ItemsSource="{Binding Path=DocumentTypeCmb,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
      Grid.Column="1" Grid.Row="4" Margin="0,4,5,5" Height="23" 
      HorizontalAlignment="Left" Name="cmbDocumentType" VerticalAlignment="Bottom" 
      Width="230" /> 

코드

//Obesrvable collection property 
private ObservableCollection<ListHelper> documentTypeCollection = new ObservableCollection<ListHelper>(); 
public ObservableCollection<ListHelper> DocumentTypeCmb 
{ 
    get 
    { 
     return documentTypeCollection; 
    } 
    set 
    { 
     documentTypeCollection = value; 
     OnPropertyChanged("DocumentTypeCmb"); 
    } 
} 

//Extract from the method where i do the binding 
documentTypeCollection.Add(new ListHelper { Text = "Item1", IsChecked = false }); 
documentTypeCollection.Add(new ListHelper { Text = "Item2", IsChecked = false }); 
documentTypeCollection.Add(new ListHelper { Text = "Item3", IsChecked = false }); 

DocumentTypeCmb = documentTypeCollection; 

//Helper class 
public class ListHelper 
{ 
    public string Text { get; set; } 
    public bool IsChecked { get; set; } 
} 

답변

7

이 시도 :

public ListHelper MySelectedItem { get; set; } 

그리고 XAML :

<ComboBox ItemsSource="{Binding Path=DocumentTypeCmb,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
     SelectedItem={Binding MySelectedItem} 
     /> 

ViewModel에서 올바른 유형을 가져 오거나 설정하는 public 속성이 필요하다면 바인딩을 사용하여 선택한 항목을 할당하면됩니다. SelectedItem은 종속성 proeprty이므로 바인딩 할 수는 있지만 목록 컨트롤 SelectedItems (복수형 참고)는 이 아니라 종속성 속성이므로 다시 VM에 바인딩 할 수 없으므로 간단한 해결 방법이 있습니다. 대신 행동을 사용합니다.

또한 당신이 UI에 업데이트되지 않습니다 VM에서 선택한 항목을 변경하는 경우 그래서, 내 예제에서 속성 변경 알림을 구현하지 않은 있습니다,하지만이에 넣어 간단하다.

+0

는 완벽한 대단히 –

+2

+1 감사하지만, itemssource 설정시 모드 = 양방향 제거하십시오 - 그냥 아무 의미가 없습니다. – blindmeis

+0

@blindmeis - 그건 사실입니다, 나는 단순히 OP 샘플에서 그 부분을 복사/붙여 넣었습니다. 그것이 기본 바인딩 모드 일 수 있지만 명시 적으로 지정하는 것은 완전히 나쁜 * 것은 아닙니다. 적어도 다른 개발자가 코드를 읽는 것은 어떤 일이 일어나고 있는지에 대해 의심의 여지가 없습니다 (이전에 WPF 코드를 매우 나쁜 것으로 보았습니다. 새 개발자에게는 단서가 없습니다.) – slugster

1

방법 이것에 관해서?

SelectedItem={Binding SelectedDocumentType} 
4

물론, ComboBoxSelectedItem 속성이 있습니다. 뷰 모델에서 속성을 노출하고 XAML에서 양방향 바인딩을 만들 수 있습니다. !

public ListHelper SelectedDocumentType 
{ 
    get { return _selectedDocumenType; } 
    set 
    { 
     _selectedDocumentType = value; 
     // raise property change notification 
    } 
} 
private ListHelper _selectedDocumentType; 

...

<ComboBox ItemsSource="{Binding DocumentTypeCmb, Mode=TwoWay}" 
      SelectedItem="{Binding SelectedDocumentType, Mode=TwoWay}" />