2013-12-11 69 views
2

我知道關於DataBinding組合框有很多問題,還有很多教程,但我覺得這些教程很難。所以,我在問這個問題。如何使用WPF MVVM中的外鍵綁定組合框

假設我有我的數據庫中的兩個表:

客戶

CustomerID 
Name 
GenderID 

GenderTypes

GenderTypeID 
GenderType 

我一直在使用ADO.Net實體數據模型創建我的模型。所以,我正在使用實體框架。

現在我在我宣佈一個屬性叫做客戶,如下一個ViewModel:

private List<Customer> _customers; 
public List<Customer> Customers 
{ 
    get 
    { 
     return _customers; 
    } 
    set 
    { 
     _customers = value; 
     OnPropertyChanged("Customers"); 
    } 
} 

現在我有一個觀點就像這樣:

<Window ......> 

    <Window.DataContext> 
     <vm:MainWindowViewModel /> 
    </Window.DataContext> 

    <Grid> 
     <Grid.RowDefinitions> 
      .. 
      .. 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      .. 
      .. 
     </Grid.ColumnDefinitions> 

     <TextBlock Text="Name" ....../> 
     <TextBox Text="{Binding Name}"...../> 

     <TextBlock Text="Gender" ....../> 
     <TextBox ItemsSource="????" 
       SelectedValue="????" 
       SelectedValuePath="????"...../> 

    </Grid> 
</Window> 

我不知道如何組合框綁定,所以我可以看到男性和女性作爲組合框的項目,當我選擇時,我應該得到相應的GenderID而不是GenderType。

我知道這是一個非常簡單而直接的問題,但我對WPF非常陌生並試圖學習它。

+0

當前綁定的窗口的數據上下文是什麼? – weeksdev

+0

它被綁定到MainWindowViewModel。我更新了我的xaml代碼。 – Khushi

回答

2

在ViewModel類

public List<GenderTypes> Genders 
     { 
      get 
      { 
       return _genders; 
      } 
      set 
      { 
       _genders = value; 
       OnPropertyChanged("Genders"); 
      } 
     } 

添加Genders這樣的使用之後。

<ListBox ItemsSource="{Binding Customers}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Text="Name" /> 
         <TextBox Text="{Binding Name}" /> 
         <TextBlock Text="Gender" /> 
         <ComboBox ItemsSource="{Binding Genders,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}" DisplayMemberPath="GenderType" SelectedValue="{Binding GenderID}" SelectedValuePath="GenderTypeID"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
+0

我認爲'DisplayMemberPath'必須是屬性的名稱,而不是綁定的您計劃動態提供該屬性的名稱。 –

+1

只是一些建議。更好的方法是使用'ObservableCollection',而不是'List'。 – Sandesh

+0

對不起,我修好了。 – ebattulga

3

試試這個:

<ComboBox 
    <!--ItemsSource bound to property of type collection of GenderTypes, containing all gender types you have --> 
    ItemsSource="{Binding MyGenderTypes}" 
    <!--Tell comboBox to display GenderType property of selected GenderTypes--> 
    DisplayMemberPath="GenderType" 
    <!--Tell comboBox that the SelectedValue should be GenderID property of selected GenderTypes--> 
    SelectedValuePath="GenderID" 
    <!--SelectedValue bound to property of type int (the same type of GenderID)--> 
    SelectedValue="{Binding SelectedGenderID, Mode=TwoWay}" /> 

你會得到顯示GenderType組合框,但所選擇的值將是相應的GenderID。正如你想...

+0

我試圖實現你的xaml,但我沒有得到任何東西在組合框中。 – Khushi

+0

代碼期望MyGenderTypes爲List 或ObservableCollection ,並且它應該先填充,以便您可以看到它們顯示在組合框中。你做到了嗎? – har07

+0

我測試了代碼,並按預期顯示了男性和女性的組合框。我使用GenderTypes填充了MyGenderTypes,其中GenderType =「Male」GenderTypeID = 0,另一個GenderType =「Female」GenderTypeID = 1 – har07