WPF级联组合框与LINQ

时间:2017-02-01 07:37:46

标签: c# wpf linq

我在自定义控件上有很多组合框,如下所示

<Label Grid.Row="12" Grid.Column="0" Name="lblCombobox1">
    Select value from Combobox1
</Label>
<ComboBox Grid.Row="12" Grid.Column="1" Name="cbxCombobox1"
        SelectionChanged="cbxCostCentre_SelectionChanged" />
<Label Grid.Row="13" Grid.Column="0" Name="lblCombobox2">
    Select value from Combobox2</Label>
<ComboBox Grid.Row="13" Grid.Column="1" Name="cbxCombobox2"/>

这个我在主窗口上使用的自定义控件,如下所示

<StackPanel Background="LightCyan">
<views:NewAccount HorizontalAlignment="Center" 
    Margin="30" FontSize="14"/>

我需要进行填充组合框级联,以使之前的组合框选择值作为下一个的过滤器参数。 似乎以下代码可以做到这一点。它正在进行过滤,为Combobox2提供一系列值。但是,我可能会遗漏一些内容,因为LINQ查询带有“where”子句,如果我使用T-SQL运行它会提供不同的结果。它非常相似,但Combobox2中的一些或多或少的值与T-SQL列表不同。

using System.Linq;
namespace AccountsSetup.UserControls
{
    public partial class NewAccount : UserControl 
    {
        public NewAccount() 
        {
            InitializeComponent();

            using (SQL.DBDataContext db = new SQL.DBDataContext())
            {
                var allCombobox1s = from t in db.Table1
                                     select t.Name;
                cbxCombobox1.ItemsSource = allCombobox1s;
            }
        }

        private void cbxCombobox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {            
            using (SQL.DBDataContext dbs = new SQL.DBDataContext())
            {
                string value = "";
                if (cbxCombobox1.SelectedIndex >= 0)
                    value = cbxCombobox1.SelectionBoxItem.ToString();
                var allCombobox2s = (from t in dbs.View1
                                       where t.Combobox1.Contains(value)
                                       select t.Name).Distinct(); 
                cbxCombobox2.ItemsSource = allCombobox2s;

            }

我确实尝试将Combobox2更改为以下代码。但是,这是相同的结果。

<ComboBox Grid.Row="13" Grid.Column="1" x:Name="cbxCombobox2"
    ItemsSource="{Binding}" SelectedValue="{Binding ElementName=cbxCombobox1,
    Path=SelectedItem.Name, Mode=OneWay}" />

请告知,可以在代码中进行哪些更正。

由于

1 个答案:

答案 0 :(得分:0)

您应该将第一个ComboBox的SelectedItem属性的值与视图中Name列的值进行比较。

试试这个:

private void cbxCombobox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    using (SQL.DBDataContext dbs = new SQL.DBDataContext())
    {
        string value = cbxCombobox1.SelectedItem as string;
        if (!string.IsNullOrEmpty(value))
        {
            var allCombobox2s = (from t in dbs.View1
                                 where t.Name != null && t.Name.Contains(value)
                                 select t.Name).Distinct().ToList();
            cbxCombobox2.ItemsSource = allCombobox2s;
        }
    }
}