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