这是我的“项目”:
我要做的是将外部.xml文件中的数据加载到DataGrid中:
XElement Persons = XElement.Load(@"d:\persons.xml");
dataGrid1.DataContext = Persons;
它工作正常,但这是一个我无法弄清楚的问题:在DataGrid的顶部你可以看到TextBox所以我需要的是使用textBox1.text作为DataGrid的数据过滤器。假设用户输入字母“a”,在DataGriw中我们应该只看到2行,名称为pAul,行为国家russiA,导致两行在其数据中都包含字母“a”。如果你也帮助我包括并排除一些列的搜索能力,那将是非常棒的。最后,如果用户点击他使用搜索按钮找到的行 - 来自销售的数据应该放在右边的标签上。我也很乐意知道如何加载所选行的数据,这些数据实际上并未在DataGrid中显示。假设在xml文件中我们有关于薪水的数据,但我们没有在DataGrid中显示它,我们需要在用户选择行时将其加载到第4个标签。这是我的XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="679" Width="1137">
<Grid Height="645" Name="grid1" Width="1119">
<DataGrid Height="300" ItemsSource="{Binding Path=Elements[person]}" Margin="26,42,839,297" Name="dataGrid1" Width="250">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Element[name].Value}" Header="Name" />
<DataGridTextColumn Binding="{Binding Path=Element[country].Value}" Header="Country" />
<DataGridTextColumn Binding="{Binding Path=Element[age].Value}" Header="Age" />
</DataGrid.Columns>
</DataGrid>
<TextBox Height="24" HorizontalAlignment="Left" Margin="26,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="250" />
<Label Content="Name goes here on row select" Height="28" HorizontalAlignment="Left" Margin="307,28,0,0" Name="label1" VerticalAlignment="Top" Width="188" />
<Label Content="Country goes here on row select" Height="28" HorizontalAlignment="Left" Margin="307,72,0,0" Name="label2" VerticalAlignment="Top" Width="188" />
<Label Content="Age goes here on row select" Height="28" HorizontalAlignment="Left" Margin="307,120,0,0" Name="label3" VerticalAlignment="Top" Width="188" />
</Grid>
请跟我说话,对于绝对的初学者,因为当你使用更聪明的东西时,我很难理解。一步一步非常感谢。谢谢......
答案 0 :(得分:1)
要过滤Datagrid,您需要创建一个CollectionViewSource并将其分配给DataGrid的ItemsSource:
private void Load()
{
XElement Persons = XElement.Load(@"d:\persons.xml");
System.ComponentModel.ICollectionView c = System.Windows.Data.CollectionViewSource.GetDefaultView(Persons.Elements());
c.Filter = new Predicate<object>(CollectionViewSource_Filter);
dataGrid1.ItemsSource = c;
}
private Boolean CollectionViewSource_Filter(object i)
{
return (i as XElement).Element("name").Value.ToString.Contains(textBox1.Text);
}
要在过滤器更改后刷新DataGrid,需要使用此方法:c.Refresh();
如果过滤器不区分大小写,请查看Case insensitive 'Contains(string)'
显示所选人员的姓名:
<TextBlock Text="{Binding Path=SelectedItem.Element[name].Value, ElementName=dataGrid1}"></TextBlock>