如何过滤DataGrid绑定到DataContext

时间:2015-08-10 17:30:14

标签: c# wpf xaml data-binding filter

我应该为 DataGrid 添加过滤功能,该功能是按照以下方式创建和绑定的。

<DataGrid ItemsSource="{Binding Path=Things, Mode=TwoWay}" ...>
  ...
  <DataGrid.Columns>
    <DataGridTextColumn Header="Id" Binding="{Binding Id}" />
    ...
  </DataGrid.Columns>
</DataGrid>

根据MSDN article,我应该添加一个集合视图源并绑定到它。但是,在示例中,他们说的是命名空间 local ,我希望从数据上下文中获取我的东西。

<Window.Resources>
  <local:Tasks x:Key="tasks" />
    <CollectionViewSource x:Key="cvsTasks" 
                          Source="{StaticResource tasks}" 
                          Filter="CollectionViewSource_Filter" />
</Window.Resources>

有可能吗?当我尝试过时,我得到了一堆空单元格。单击它们用于打开一个对话框,其中单击行的值可编辑(并预先填充表中的数据),但现在我只能在任何地方获得空框。我的版本看起来像这样。

<Window.Resources>
  <CollectionViewSource x:Key="ThingsFiltered"
                        Source="{Binding Path=Things}"
                        Filter="ThingsFiltered_OnFilter" />
</Window.Resources>

现在,数据网格中的绑定就像这样完成。

<DataGrid ItemsSource="{Binding Source=ThingsFiltered}" ...>
  ...
  <DataGrid.Columns>
    <DataGridTextColumn Header="Id" Binding="{Binding Id}" />
    ...
  </DataGrid.Columns>
</DataGrid>

我的猜测是我没有正确绑定集合视图源。事实上,应该处理过滤器的方法根本不会被调用。在数据网格及其列中尝试不同的语法后,我承认我不知道如何使其工作。建议?

1 个答案:

答案 0 :(得分:2)

您可能遇到的问题是声明和使用myThings。您需要确保在顶部定义local,然后在<Window.Resources>中实例化您的列表。在Source的{​​{1}}中使用时,请确保在名称前面写<CollectionViewSource>,而不是StaticResource

经过大量测试后,我就是这样做的。我主要使用了MSDN文档背后的想法。

我的MainWindow.xaml。您需要为当前解决方案定义本地。

Binding

所以在这里,关于<Window x:Class="WpfApplication18.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication18" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <local:Things x:Key="myThings"/> <CollectionViewSource x:Key="ThingsFiltered" Source="{StaticResource myThings}" Filter="ThingsFiltered_OnFilter" /> </Window.Resources> <StackPanel> <DataGrid x:Name="dataGrid1" ItemsSource="{Binding Source={StaticResource ThingsFiltered}}" CanUserAddRows="False"> </DataGrid> </StackPanel> 的棘手部分是你在那里定义你的列表,然后绑定到这个列表。

我的其他课程非常简单:

<local:Things x:Key="myThings"/>

public class Thing
{
    public int Id { get; set; }
    public string Name { get; set; }
}

这样做,它最终会点击过滤器代码并执行以下操作:

public class Things: ObservableCollection<Thing>
{
    public Things()
    {
        this.Add(new Thing() { Id = 1, Name = "Maxime" });
        this.Add(new Thing() { Id = 2, Name = "Konrad" });
    }
}