Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何同时绑定到列表和子列表?_C#_Winforms_Data Binding - Fatal编程技术网

C# 如何同时绑定到列表和子列表?

C# 如何同时绑定到列表和子列表?,c#,winforms,data-binding,C#,Winforms,Data Binding,我想将表单上的数据绑定到组合框。组合框需要始终显示相同的对象,并绑定到对象的不同属性,但其中一个组合框仅显示所有可能对象的子集 我的对象可以描述为: {"q",#1,1},{"w",#1,2},{"e",#1,3},{"r",#2,6},{"t",#3,2},{"y",#3,6} etc 第一个组合框显示第一个字段和完整列表,确切地说: "q","w","e","r","t","y" etc 第二个组合框显示第三个字段,但仅适用于与当前选定对象具有类似第二个字段的对象 如果选择了{q,1,1

我想将表单上的数据绑定到组合框。组合框需要始终显示相同的对象,并绑定到对象的不同属性,但其中一个组合框仅显示所有可能对象的子集

我的对象可以描述为:

{"q",#1,1},{"w",#1,2},{"e",#1,3},{"r",#2,6},{"t",#3,2},{"y",#3,6} etc
第一个组合框显示第一个字段和完整列表,确切地说:

"q","w","e","r","t","y" etc
第二个组合框显示第三个字段,但仅适用于与当前选定对象具有类似第二个字段的对象

如果选择了{q,1,1},它将显示:

1,2,3
6
如果选择了{r,2,6},则显示:

1,2,3
6
在任意组合框中选择另一项会更改当前选定的项,并相应地更新其他组合框

使用winforms数据绑定最优雅或“正确”的方法是什么?对我来说,elegat不会求助于处理当前所选项目的更改。

这可能有助于:

List<Tuple<string, string, int>> values = new List<Tuple<string, string, int>>();
然后:

comboBox1.DisplayMember = "Item1";
comboBox1.DataSource = values;

comboBox2.DisplayMember = "Item3";

var filter = ((Tuple<string, string, int>)comboBox1.SelectedItem).Item2;

comboBox2.DataSource = values.Where(input => input.Item2 == filter);

为要绑定到的每个组合框创建属性。现在,属性实际上可以是LINQ表达式,为您过滤正确的数据

此类属性的一个示例:

private final List<MyObj> _allObjects = new List<MyObj>();
... // fill the _allObjects somewhere


public IEnumerable<MyObj> AllGoodObjects 
{
    get { return from o in _allObjects 
                 where o.IsGood
                 select o; }
}

public IEnumerable<MyObj> AllBadObjects 
{
    get { return from o in _allObjects 
                 where !o.IsGood
                 select o; }
}

您可以创建复杂的查询,实际上可以选择任何您想要的内容。

不知道如何在同一对象上设置绑定控件。如果我理解正确,这意味着comboBox1选择更改时,comboBox2数据源必须随时更改,也就是说,在SelectedItemChanged的处理程序中。