WPF组合框基于第一个组合选择更新其他组合框

时间:2014-06-02 04:15:42

标签: c# wpf combobox

我的WPF应用程序有2个组合框如下

<ComboBox Height="23" Name="ProjectNameComboBox" Width="215" ItemsSource="{Binding}" DisplayMemberPath="name" SelectionChanged="ProjectSelection_Changed" />

<ComboBox Height="25" Name="LangaugeComboBox"  Width="108" ItemsSource="{Binding}" DisplayMemberPath="name"  />

从后面的代码我使用数据库绑定

ProjectNameComboBox.DataContext = dbConnector.GetProjectNames();
LangaugeComboBox.DataContext = dbConnector.GetLanguages();

项目组合框包含项目列表

langauges组合框包含语言列表。

我想根据项目选择更新langauges组合框。

基于项目选择我能够从数据库中获取该项目的语言,但是如何在langauge组合框中设置它。

LangaugeComboBox.SelectedValue = dt.Rows [0] [0] .ToString();没有用。

和建议/帮助?

2 个答案:

答案 0 :(得分:1)

我建议您先从事件迁移到绑定和更改通知。那将是更多的WPF方式。

所以两个组合框的代码变成这样,我删除了SelectionChanged事件处理程序,除非需要,否则我也会删除名称

<ComboBox Height="23" Width="215" ItemsSource="{Binding Projects}" DisplayMemberPath="name" SelectedItem="{Binding SelectedProject}" />
<ComboBox Height="25" Width="108" ItemsSource="{Binding Languages}" DisplayMemberPath="name" SelectedItem="{Binding SelectedLanguage}" />

然后(而不是)具有以下属性的类后面的代码,然后该类的实例作为视图的DataContext

    public ObservableCollection<Project> Projects
    {
        get { return (ObservableCollection<Project>)GetValue(ProjectsProperty); }
        set { SetValue(ProjectsProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Projects.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ProjectsProperty =
        DependencyProperty.Register("Projects", typeof(ObservableCollection<Project>), typeof(ViewModel), new PropertyMetadata(null));

    public ObservableCollection<Language> Languages
    {
        get { return (ObservableCollection<Language>)GetValue(LanguagesProperty); }
        set { SetValue(LanguagesProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Languages.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty LanguagesProperty =
        DependencyProperty.Register("Languages", typeof(ObservableCollection<Language>), typeof(ViewModel), new PropertyMetadata(null));

    public Project SelectedProject
    {
        get { return (Project)GetValue(SelectedProjectProperty); }
        set { SetValue(SelectedProjectProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SelectedProject.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedProjectProperty =
        DependencyProperty.Register("SelectedProject", typeof(Project), typeof(ViewModel), new PropertyMetadata(null, OnSelectedProjectChanged));

    public Language SelectedLanguage
    {
        get { return (Language)GetValue(SelectedLanguageProperty); }
        set { SetValue(SelectedLanguageProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SelectedLanguage.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedLanguageProperty =
        DependencyProperty.Register("SelectedLanguage", typeof(Language), typeof(ViewModel), new PropertyMetadata(null));

然后最后是属性更改处理程序

    private static void OnSelectedProjectChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        View v = d as View;
        v.SelectedLanguage = //your logic here eg. v.SelectedProject.Language;
    }

因此,在绑定到位后,您的语言组合框将根据您设置为SelectedLanguage的值更新所选项目。

答案 1 :(得分:0)

如果您的语言ComoboBox没有受到复杂对象的约束,并且它是string集合,请尝试以下代码

LangaugeComboBox.SelectedItem = dt.Rows[0][0].ToString();