2012-06-08 80 views
1

我得到了一個包含五個條目和五個UserControl的組合框。正確處理WPF用戶控件上的控件

當我選擇組合框條目之一時,我想將第一個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(); 
    [...] 
} 

點擊一個按鈕,我想要得到的分配控制的價值,但我不知道如何訪問用戶控件。

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

如何訪問UserControl的控件並獲取它們的值?

回答

3

就個人而言,我會使用MVVM設計模式

ComboBox將被綁定到ViewModelModel對象

所以集合做這樣的事情你必須

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

SomeCollection是您的ViewModel上的object的集合,並且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]; 

現在你SaveCommand可以訪問任何通過使用SelectedViewModel,並澆鑄成基於typeof(SelectedViewModel相應的類型)

個人而言,我會用一個通用的接口,像IViewModel,而不是一個選擇object,並讓它包含一些通用屬性(如DisplayName)和方法。根據你的功能,你甚至可以把它包含它自己保存的邏輯,所以你可以在保存命令執行此:

SelectedViewModel.Save(); 

至於顯示正確的視圖/用戶控件,我會用一個ContentControl,與它的Content綁定到您的SelectedViewModel,並使用隱式數據模板來告訴WPF如何繪製每個對象

<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相當陌生。 – SeToY

+0

一個示例可能不會幫助你理解它 - 我建議你找一些很好的WPF UserControl演練和文檔,並仔細閱讀它。網上有很多關於它的信息。 –