我正在尝试为WPF中的DataGrid创建一个过滤系统,就像在链接中一样 -
http://www.codeproject.com/Articles/42227/Automatic-WPF-Toolkit-DataGrid-Filtering
我正在使用他们正在使用的相同库但事情是我需要将我的DataGrid绑定到数据表...
错误就在哪里..只要ItemSource是LIST,过滤器库就可以正常工作,但当ItemSource是DataTable时停止工作...
任何替代方案或建议???工作实例赞赏..
我正在使用AutoColumnGeneration = True,因为我不知道需要填充多少列
答案 0 :(得分:4)
表中的每个DataRow都包含一个对象的平面数组,只有从DataColumns数组中提取它才能访问其类型。由于数组中的所有内容都是盒装的,因此依赖强类型集合的库(如List of T)将不兼容。这应该解释为什么它不起作用。
你写道,这很紧急,我必须在一个保险丝很短的项目中做同样类型的事情,我将概述我的方法。这个答案仅针对 URGENT 个案。
这是一个ViewModel ......
public class ViewModel : INotifyPropertyChanged
{
public CollectionView MyCollectionView { get; set; }
public ViewModel(DataTable dataTable)
{
MyCollectionView = CollectionViewSource.GetDefaultView(dataTable.Rows) as CollectionView;
if (MyCollectionView != null)
{
MyCollectionView.Filter = o => (o as DataRow).ItemArray[0].ToString().Contains("2");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}
构造函数使用DataTable并使用Rows作为CollectionView的绑定源。由于CollectionView具有内置的过滤和排序属性,因此它是一个很好的工具,可用作绑定源。同样如图所示,构造函数为示例添加了一个过滤器,以帮助您入门。
要向用户显示数据,请考虑以下Xaml ...
<DataGrid ItemsSource="{Binding MyCollectionView}"
AutoGenerateColumns="False"
CanUserSortColumns="True"
IsReadOnly="True"
>
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding ., Converter=
{db:DbConverter}, ConverterParameter=PersonName}"/>
<DataGridTextColumn Header="Address" Binding="{Binding ., Converter=
{db:DbConverter}, ConverterParameter=PersonAddress}"/>
</DataGrid.Columns>
</DataGrid>
这是一个DataGrid,其ItemsSource绑定到在ViewModel中声明和分配的CollectionView。每列数据都通过一个转换器以及一个告诉转换器需要做什么的参数。
关闭所有内容,这是转换器......
public class DbConverter : MarkupExtension, IValueConverter
{
private static readonly Dictionary<object, int> ParameterToColumnMapping;
static DbConverter()
{
ParameterToColumnMapping = new Dictionary<object, int>
{
{"PersonName", 0}, {"PersonAddress", 1}
};
}
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
DataRow dr = value as DataRow;
if (dr != null)
{
if (ParameterToColumnMapping.ContainsKey(parameter))
{
return dr.ItemArray[ParameterToColumnMapping[parameter]];
}
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return null;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
当你有一个DataTable和一个紧急情况时,那应该让你回到正确的过滤和呈现。所有编码大约需要一个小时。另请注意我的绑定到 Rows ,但如果需要,您还可以绑定到 DefaultView 。