C# WPF-根据其他控件更改绑定数据

C# WPF-根据其他控件更改绑定数据,c#,wpf,data-binding,datagrid,C#,Wpf,Data Binding,Datagrid,我正在尝试使用WPF进行实验,所以我创建了一些测试窗口来查看它是如何运行的。 我得到了一个窗口,其中包含一个带有一些选项的组合框,窗口中有一个数据网格,它绑定到组合框所选项目列表的属性,这意味着当您在组合框中选择一个项目时,数据网格会相应地更新 <DataGrid Grid.Row="1" AutoGenerateColumns="True" ItemsSource="{Binding ElementName=comboBoxPeople,

我正在尝试使用WPF进行实验,所以我创建了一些测试窗口来查看它是如何运行的。 我得到了一个窗口,其中包含一个带有一些选项的组合框,窗口中有一个数据网格,它绑定到组合框所选项目列表的属性,这意味着当您在组合框中选择一个项目时,数据网格会相应地更新

<DataGrid Grid.Row="1" AutoGenerateColumns="True"
          ItemsSource="{Binding ElementName=comboBoxPeople, 
                                Path=SelectedItem.OrdersList}"/>
我在窗口中添加了一个复选框和一个文本框,我想使用它们来过滤数据网格中的一些行。该复选框确定是否存在任何过滤,过滤本身根据文本框中的文本完成


如何使用复选框和文本框过滤DataGrid的行?我知道我可以制作一个带有多重绑定的多值转换器,并返回我想要的DataGrid的新ItemsSource,但我正在寻找其他解决方案。

AllItems您可以将包含DataGrid行的对象的筛选器属性绑定到复选框和文本框。每次更新这些属性时,您也会更新筛选。 另外,您可以实现INotifyPropertyChanged接口,并在每次DataGrid行列表更改时引发PropertyChanged事件

绑定到的类的外观如下所示:

class Class1 : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
            private List<OrderItem> allItems;

    private string textBoxValue;
    public string TextBoxValue
    {
        get { return textBoxValue; }
        set
        {
            textBoxValue = value;
            updateList();
        }
    }

    private List<OrderItem> orderItems;
    private List<OrderItem> OrderItems
    {
        get { return orderItems; }
        set
        {
            orderItems= value;
            PropertyChanged(this, new PropertyChangedEventArgs("OrderItems"));
        }
    }

    private void updateList()
    {
        List<OrderItem> newList = new List<OrderItem>();
        //update the List
        foreach (OrderItem orderItem in allItems)
        {
            if (orderItem[name] == textBoxValue) newList.Add(orderItem);
        }
        OrderItems= newList;
    }
}

但是,数据网格本身如何显示新线呢?DataGrid的ItemsSource是否应该绑定到DataGridItems属性?但它已经绑定到组合框。另外,如何在updateList方法中获取DataGrid中的当前行,以便对它们进行过滤?数据网格已经保存了一些行,我希望能够执行类似if line[name]!=文本框。文本然后过滤行如果我理解正确,组合框的每个项目都有一个OrdersList,并且您希望使用文本框和复选框过滤此列表。您可以通过使用ComboBox元素列表并将文本框和复选框绑定到所选元素来实现这一点。一旦引发PropertyChanged事件,DataGrid将再次获取OrderItems并显示新行,在我接受它之前只显示一件事。。。目前的解决方案是修改原始列表。我想保持它的完整性,只过滤数据网格本身的显示,也就是说,只过滤其行。有没有一种方法可以在不使用两个列表的情况下执行此操作?一个用于原始列表以在我不想筛选时还原它,另一个用于数据网格显示?好的,这是最简单的方法,因为列表只包含引用,所以内存中没有太多开销