Wpf 每行动态更新listview中的combobox itemsource

Wpf 每行动态更新listview中的combobox itemsource,wpf,listview,dynamic-binding,Wpf,Listview,Dynamic Binding,我目前有一个包含3个组合框的列表视图框。我正在用sql数据库中的数据填充它们。对于每一行,我想让第三个组合框根据第二个组合框的选定值更改其内容 <ListView.View> <GridView> <GridViewColumn Header="Employee" Width="150"> <GridViewColumn.CellTemplate> <DataTe

我目前有一个包含3个组合框的列表视图框。我正在用sql数据库中的数据填充它们。对于每一行,我想让第三个组合框根据第二个组合框的选定值更改其内容

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>
组合框将是:cmbx1(员工[杰克、吉尔、汤姆、丽莎])、cmbx2(产品[笔、铅笔、订书机])、cmbx3(颜色-将根据产品可用的颜色动态变化)

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>
产品和颜色选项:钢笔[红、蓝、黑];铅笔[黑色、橙色、红色];订书机[粉红色、青色、紫色、棕色]

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>
如果对于第1行,用户选择笔,则该行的颜色组合框中将仅列出该产品的可用颜色。根据所选的产品,下一行可以有不同的颜色选项

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>
这是可能的还是我应该找到另一种方法来实现结果

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>
这是一家公司目前拥有的

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>
代码隐藏

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>
List<Int32> liEmployee = new List<Int32>();
List<string> lsEmployee = new List<string>();
List<Int32> liProduct = new List<Int32>();
List<string> lsProduct = new List<string>();
List<Int32> liColor = new List<Int32>();
List<string> lsColor = new List<string>();

SqlConnection conn = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=testDB;Persist Security Info=True;User ID=USER;Password=PASSWORD;");//Connect Timeout=900
SqlCommand cmd1 = new SqlCommand("select id,employee from testDB.dbo.dmEmployee where inactive=0", conn);
SqlCommand cmd2 = new SqlCommand("select id,Product from testDB.dbo.tblProductList where inactive=0", conn);
SqlCommand cmd3 = new SqlCommand("select id,Color from testDB.dbo.Color where inactive=0", conn);

conn.Open();
SqlDataReader dr1 = cmd1.ExecuteReader();
while (dr1.Read())
{
    liEmployee.Add(dr1.GetInt32(dr1.GetOrdinal("id")));
    lsEmployee.Add(dr1.GetString(dr1.GetOrdinal("employee")));
}
conn.Close();
conn.Open();
SqlDataReader dr2 = cmd2.ExecuteReader();
while (dr2.Read())
{
    liProduct.Add(dr2.GetInt32(dr2.GetOrdinal("id")));
    lsProduct.Add(dr2.GetString(dr2.GetOrdinal("Product")));
}
conn.Close();
conn.Open();
SqlDataReader dr3 = cmd3.ExecuteReader();
while (dr3.Read())
{
    liColor.Add(dr3.GetInt32(dr3.GetOrdinal("id")));
    lsColor.Add(dr3.GetString(dr3.GetOrdinal("Color")));
}
conn.Close();


List<lvItem> itemFound = new List<lvItem>();
itemFound.Clear();
lvItem puzzlePieces;
for (int cnt = 0; cnt < 10; cnt++)
{
    puzzlePieces = new lvItem();

    puzzlePieces.lStrEmployee = lsEmployee;
    puzzlePieces.lStrDatabase = lsDatabase;
    puzzlePieces.lStrProvider = lsProvider;

    itemFound.Add(puzzlePieces);
}
list1.ItemsSource = itemFound;
List liEmployee=new List();
List lsEmployee=新列表();
List liProduct=新列表();
List lsProduct=新列表();
List liColor=新列表();
List lsColor=新列表();
SqlConnection conn=newsqlconnection(“数据源=localhost\\SQLEXPRESS;初始目录=testDB;持久安全信息=True;用户ID=User;密码=Password;”//连接超时=900
SqlCommand cmd1=新的SqlCommand(“选择id,从testDB.dbo.dmEmployee中选择员工,其中不活动=0”,conn);
SqlCommand cmd2=新SqlCommand(“从testDB.dbo.tblProductList中选择id,其中非活动=0”,conn);
SqlCommand cmd3=新SqlCommand(“从testDB.dbo.Color中选择id、颜色,其中不活动=0”,conn);
conn.Open();
SqlDataReader dr1=cmd1.ExecuteReader();
while(dr1.Read())
{
添加(dr1.GetInt32(dr1.GetOrdinal(“id”));
lsEmployee.Add(dr1.GetString(dr1.GetOrdinal(“雇员”));
}
康涅狄格州关闭();
conn.Open();
SqlDataReader dr2=cmd2.ExecuteReader();
while(dr2.Read())
{
liProduct.Add(dr2.GetInt32(dr2.GetOrdinal(“id”));
lsProduct.Add(dr2.GetString(dr2.GetOrdinal(“产品”));
}
康涅狄格州关闭();
conn.Open();
SqlDataReader dr3=cmd3.ExecuteReader();
while(dr3.Read())
{
liColor.Add(dr3.GetInt32(dr3.GetOrdinal(“id”));
添加(dr3.GetString(dr3.GetOrdinal(“颜色”));
}
康涅狄格州关闭();
List itemFound=新列表();
itemFound.Clear();
物品拼图;
对于(int-cnt=0;cnt<10;cnt++)
{
拼图块=新的lvItem();
puzzlePieces.lStrEmployee=lsEmployee;
puzzlePieces.lStrDatabase=lsDatabase;
puzzlePieces.lStrProvider=lsProvider;
itemFound.添加(拼图块);
}
list1.ItemsSource=itemFound;

谢谢

我很惊讶你的问题没有得到任何答案。也许是因为你似乎没有按照WPF的方式做事,或者是因为你要求太多

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>
第一件事第一。。。您需要创建一个数据类型类,该类实现该接口,并包含在
列表视图的每一行中显示所需的所有属性。在本例中,需要三个集合和三个选定项值。例如,您可以这样做(自己实现
INotifyPropertyChanged
接口):

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>
填充集合后,现在可以将其绑定到
ListView
控件:

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>
xmlns:Local="clr-namespace:YourWpfApplicationName"
...
<ListView ItemsSource="{Binding RowData, RelativeSource={RelativeSource AncestorType={
    x:Type Local:MainWindow}}}">
    ...
</ListView>
您需要定义本例中的其他列。因此,这个难题的最后一部分是如何根据其他
组合框
的选定值更新
颜色
组合框
的内容?答案在于
RowData
类中的选定值属性:

<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>
public Employee SelectedEmployee
{
    get { return selectedEmployee; }
    set
    {
        selectedEmployee = value;
        NotifyPropertyChanged(SelectedEmployee);
        Colours = GetColours();
    }
}

private ObservableCollection<Brush> GetColours()
{
    ObservableCollection<Brush> newColours = new ObservableCollection<Brush>();
    if (SelectedEmployee.Name == "Some Name" && SelectedProduct.Name == 
        "Some Product") newColours.AddRange( new List<Brush>() { Brushes.Red, 
        Brushes.White, Brushes.Blue } );
    else ...
}
公共员工选择员工
{
获取{return selectedEmployee;}
设置
{
selectedEmployee=值;
NotifyPropertyChanged(选定员工);
colors=getcolors();
}
}
私有可观察收集getcolors()
{
ObservableCollection newcolors=新的ObservableCollection();
如果(SelectedEmployee.Name==“Some Name”&&SelectedProduct.Name==
“某些产品”)newcolors.AddRange(新列表(){brushs.Red,
画笔。白色,画笔。蓝色});
其他的
}

有很多方法可以做到这一点,我将留给你。你现在应该有一个有效的例子,我现在意识到为什么没有人回答你的问题。。。对于任何一个头脑清醒的人来说,打字太多了!在花了这么长时间之后,如果您能自己解决您发现的任何小问题,我将不胜感激,并希望它能对您有所帮助。

很抱歉,我花了这么长时间才对此做出回应。这是我的第一个WPF项目,我没有“WPF方式”方面的培训,所以这对我来说是一个很大的学习经历。感谢您的详细示例。
<ListView.View>
    <GridView>
        <GridViewColumn Header="Employee" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrEmployee}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Product" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrProduct}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Color" Width="150">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding lStrColor}" Width="120" />
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
</ListView.View>