2012-06-08 3 views
1

5 개의 항목과 5 개의 UserControl이있는 ComboBox가 있습니다.WPF UserControl 컨트롤의 적절한 처리

ComboBox Entry를 선택하면 첫 번째 UserControl을 그리드에 할당하려고합니다. 두 번째 ComboBox 항목에서 두 번째 UserControl, 세 번째 항목 ... 등등.

이제 각 UserControl에는 TextControls, ComboBoxes 및 CheckBoxes와 같은 여러 개의 컨트롤이 포함되어 있습니다.

버튼 클릭에
combobox_SelectedIndexChanged() 
{ 
    if(comboBox.SelectedIndex == 1) 
     grid.Content = new UserControlOne(); 
    else if(comboBox.SelectedIndex == 2) 
     grid.Content = new UserControlTwo(); 
    else if(comboBox.SelectedIndex == 3) 
     grid.Content = new UserControlThree(); 
    [...] 
} 

, 나는 할당 된 컨트롤의 값을 얻으려면,하지만 난 UserControl을 액세스하는 방법을 모른다 :

는의는 다음 의사 코드를 가정 해 봅시다.

buttonSave_click() 
{ 
    //TODO: Get Values of a UserControl and assign it to the Model-Class  
} 

어떻게 컨트롤을 UserControl에 액세스하고 값을 가져 옵니까?

답변

3

개인적으로, 나는 당신이 가진 것

ComboBoxViewModel 또는 Model 객체

그래서

의 컬렉션에 바인딩 될 것 MVVM 디자인 패턴을 사용하여 같은 것을 할 것

<ComboBox ItemsSource="{Binding SomeCollection}" 
      SelectedItem="{Binding SelectedViewModel}" 
      DisplayMemberPath="DisplayName" /> 

여기서 SomeCollectionViewModelobject의 모음이고 SelectedViewModelobject 속성입니다. 선택한 항목을

SomeCollection = new ObservableCollection<object>(); 
SomeCollection.Add(new ViewModelA()); 
SomeCollection.Add(new ViewModelB()); 
SomeCollection.Add(new ViewModelC()); 
SomeCollection.Add(new ViewModelD()); 
SomeCollection.Add(new ViewModelE()); 

SelectedViewModel = SomeCollection[0]; 

을 잡아 이제 SaveCommandSelectedViewModel을 사용하고 typeof(SelectedViewModel에 따라 적절한 타입)

는 개인적으로 내가 대신 IViewModel 같은 일반적인 인터페이스를 사용하는 것으로 캐스팅으로 선택되어 무엇에 액세스 할 수 있습니다 object이고 일부 일반 속성 (예 : DisplayName) 및 메소드가 포함되어 있습니다. 당신의 기능에 따라, 심지어는 논리를 저장 자신의 IT가 포함되어있을 수 있습니다, 그래서 당신은 저장 명령이를 실행할 수 있습니다 : 그것은 함께,

SelectedViewModel.Save(); 

올바른보기/UserControl을 표시에 관해서는, 나는 ContentControl을 사용 ContentSelectedViewModel에 바인딩, 당신은 나를 위해 샘플을 보내 주시면, 어떻게

<ContentControl Content="{Binding SelectedViewModel}"> 
    <ContentControl.Resources> 
     <DataTemplate DataType="{x:Type local:ViewModelA}"> 
      <local:UserControlA /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:ViewModelB}"> 
      <local:UserControlB /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:ViewModelC}"> 
      <local:UserControlC /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:ViewModelD}"> 
      <local:UserControlD /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:ViewModelE}"> 
      <local:UserControlE /> 
     </DataTemplate> 
    </ContentControl.Resources> 
</ContentControl> 
+0

* * 아주 * 좋은 직장이었습니다.건배 – Berryl

+0

정말 감사했습니다. 슬프게도 단순히 전체 응용 프로그램을 MVVM 패턴으로 이동할 수 없습니다. – SeToY

1

UserControl의 클래스에 종속성 속성을 추가하고 세계에 공개하려는 UserControl 안에있는 컨트롤의 속성에 바인딩합니다. 이를 통해 UserControl은 외부 환경에 적합한 인터페이스를 제공하면서 내부 환경의 안전을 위해 필요한 모든 작업을 수행 할 수 있습니다.

+0

이 답변에 감사드립니다 각 개체를 그리는 WPF에게 암시 적 데이터 템플릿을 사용할 수 있습니까? WPF를 처음 접했을 때 의존성 프로퍼티로 작업 해 본 적이 없습니다. – SeToY

+0

샘플은 아마도 이해하는 데 도움이되지 않을 것입니다. WPF UserControl 연습 및 문서를 찾아서주의 깊게 읽으십시오. 온라인에 대한 많은 정보가 있습니다. –