【问题标题】:WPF - changing bound data according to other controlsWPF - 根据其他控件更改绑定数据
【发布时间】:2014-03-16 00:12:50
【问题描述】:

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

<DataGrid Grid.Row="1" AutoGenerateColumns="True"
          ItemsSource="{Binding ElementName=comboBoxPeople, 
                                Path=SelectedItem.OrdersList}"/>

我在窗口中添加了一个 CheckBox 和一个 TextBox,我想使用它们来过滤数据网格中的一些行。 checkBox判断是否有任何过滤,过滤本身是根据TextBox中的文本来完成的。

如何使用 CheckBox 和 TextBox 过滤 DataGrid 的行?我知道我可以使用 MultiBinding 制作一个 MultiValueConverter 并返回我想要的 DataGrid 的新 ItemsSource,但我正在寻找其他解决方案。

【问题讨论】:

    标签: c# wpf data-binding datagrid


    【解决方案1】:

    allItems您可以将包含 DataGrid-Lines 的对象的过滤器属性绑定到 CheckBox 和 TextBox。每次更新这些属性时,您也会更新过滤。 另外,您实现 INotifyPropertyChanged 接口,并在每次 DataGrid-Lines 列表更改时引发 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] != TextBox.Text then filter the line”的操作
    • 如果我理解正确的话,ComboBox 的每个项目都有一个 OrdersList,并且您想使用 TextBox 和 CheckBox 过滤这个列表。您可以通过使用 ComboBox-Elements 列表并将 TextBox 和 CheckBox 绑定到所选元素来实现。
    • 一旦您提出 PropertyChanged-Event,DataGrid 将再次获取 OrderItems 并显示新行
    • 在我接受它之前只有一件事......这个解决方案现在正在修改原始列表。我想保持它完整并只过滤数据网格本身的显示(仅表示它的行)。有没有办法在没有 2 个列表的情况下做到这一点(一个用于在我不想过滤时恢复原始列表,一个用于数据网格显示)?
    • afaik 这是最简单的方法,而且由于 List 只包含引用,内存中没有太多开销
    猜你喜欢
    • 2014-12-20
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多