如何在WPF MVVM中将组合框与外键绑定

时间:2013-12-11 03:27:38

标签: c# wpf silverlight xaml mvvm

我知道有很多关于DataBinding组合框的问题,还有很多教程,但我觉得这些教程很难。所以,我在问这个问题。

假设我的数据库中有两个表:

客户

CustomerID
Name
GenderID

GenderTypes

GenderTypeID
GenderType

我使用ADO.Net实体数据模型创建了我的模型。所以,我正在使用实体框架。

现在我有了一个ViewModel,我在其中声明了一个名为Customers的属性,如下所示:

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非常陌生,并试图学习它。

2 个答案:

答案 0 :(得分: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。正如你所愿......

答案 1 :(得分:2)

在ViewModel类

中添加Genders
public List<GenderTypes> Genders
        {
            get
            {
                return _genders;
            }
            set
            {
                _genders = value;
                OnPropertyChanged("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>