将ComboBox绑定到Model / ViewModel

时间:2015-09-08 09:16:42

标签: c# wpf mvvm combobox

我尝试做的是将ItemSource绑定到模型中表中的所有值,并将SelectedValue绑定到第一个链接到的表的外键。以下是我的尝试。

以下是我的两张表: The attribute the client_typeID is linked to is called 'ClientType'. client_type1 is what i want the View to display

注意:client_typeID链接到的属性称为' ClientType'。 client_type1是我希望View显示的内容。

以下是获取客户类型列表的DataAccessService方法:

public List<string> GetClientTypes()
{
    List<string> ClientType = new List<string>();
    foreach (var item in context1.Client_Type)
    {
        ClientType.Add(item.client_type1);
    }
    return ClientType;
}

这是我的ViewModel:

public List<string> Client_type_list
{
    get { return ServerPxy.GetClientTypes(); }
}

private Entity record;
public Entity Record
{
    get { return record; }
    set
    {
        record = value;
        RaisePropertyChanged("Record");
    }
}

注意:ServerPxy是我的DataAccessService实例,Record是权利表的属性。

这是我的ComboBox XAML:

<ComboBox Grid.Column="3" Grid.Row="0" MaxHeight="26" Margin="2" ItemsSource="{Binding Client_type_list}" Text="{Binding Record.Client_Type.client_type1}" />

所有这些都为我提供了ComboBox,它具有正确的ItemSource和选择的正确值。唯一的问题是,当我更改SelectedItem时,它会在运行Update方法时更新Client_Type表的描述,而不是Entity表的外键。

此外,我试图关注this示例,但它对我没有帮助。

任何帮助都会让我非常感激。

1 个答案:

答案 0 :(得分:2)

实际上,组合框没有ID信息,您还必须绑定VM中的SelectedValue或SelectedItem属性。您应该在viewmodel中创建Client_Type列表,然后将其与View绑定。我做了一个小POC希望这会给你足够的信息。您的代码看起来像

查看

 <ComboBox Grid.Column="3" Grid.Row="0" MaxHeight="26" Margin="2" ItemsSource="{Binding Client_type_list}" 
                  ItemTemplate="{StaticResource Client_typeDataTemplate}"
                  SelectedValue="{Binding Record.Client_Type}">
 <ComboBox.Resources>
 <DataTemplate x:Key="Client_typeDataTemplate">
 <TextBlock Text="{Binding Client_type1} "/>
  </DataTemplate>
   </ComboBox.Resources>
  </ComboBox>
        <Button Click="Button_Click" Height="20"/>

ViewModel(假设你知道这个,我已经用viewmodel合并了代码背后的代码)

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        Record = new Entity();
    }

    public List<Client_Type> Client_type_list
    {
        get { return GetClientTypes(); }
    }

    private Entity record;
    public Entity Record
    {
        get { return record; }
        set
        {
            record = value;
            OnPropertyChanged("Record");
        }
    }


    protected void OnPropertyChanged(string propertyName)
    {
        var handler = this.PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;


    public List<Client_Type> GetClientTypes()
    {
        List<Client_Type> ClientType = new List<Client_Type>();
        {
            ClientType.Add(new Client_Type() { Client_type1 = "a", Client_typeId = "1" });
            ClientType.Add(new Client_Type() { Client_type1 = "b", Client_typeId = "2" });
        }
        return ClientType;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(Record.Client_Type.Client_typeId);
    }

}

现在当选择更改时,Record也因绑定而发生变化。希望这些信息有所帮助。