首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有LINQ的WPF级联组合框

带有LINQ的WPF级联组合框
EN

Stack Overflow用户
提问于 2017-02-01 15:37:46
回答 1查看 589关注 0票数 1

我在自定义控件上确实有一些组合框,如下所示

代码语言:javascript
复制
<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"/>

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

代码语言:javascript
复制
<StackPanel Background="LightCyan">
<views:NewAccount HorizontalAlignment="Center" 
    Margin="30" FontSize="14"/>

我需要做填充组合框级联,以使前一个组合框选择的值作为下一个组合框的筛选器参数。看起来下面的代码可以做到这一点。它正在进行过滤,为Combobox2提供一个值列表。但是,我可能遗漏了一些东西,因为带有“where”子句的LINQ查询提供的结果与使用T-SQL运行时不同。它与T-SQL列表非常相似,但在Combobox2中有一些不同于T-SQL列表的值。

代码语言:javascript
复制
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更改为以下代码。但是,结果是一样的。

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

请告知在代码中可以做哪些修改。

谢谢

EN

Stack Overflow用户

发布于 2017-02-01 18:58:59

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

试试这个:

代码语言:javascript
复制
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;
        }
    }
}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41974322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档