Raj*_*eja 1 wpf wpf-controls wpfdatagrid wpf-4.0
我正在尝试为 WPF 中的 DataGrid 创建一个过滤系统,就像链接中一样 -
http://www.codeproject.com/Articles/42227/Automatic-WPF-Toolkit-DataGrid-Filtering

我使用的库与他们使用的库相同,但问题是我需要将 DataGrid 绑定到数据表...
错误就在那里......只要 ItemSource 是 LIST,过滤器库就可以完美工作,但当 ItemSource 是 DataTable 时,过滤器库就会停止工作......
有什么替代方案或建议吗???工作示例表示赞赏..
我正在使用 AutoColumnGeneration=True 因为我不知道需要填充多少列
表中的每个 DataRow 都包含一个平面对象数组,其类型只能通过从 DataColumns 数组中提取来访问。由于数组中的所有内容都是装箱的,因此依赖于强类型集合(例如 T 的 List)的库将不兼容。这应该可以解释为什么它不起作用。
您写道,这很紧急,我必须在一个非常短暂的项目中做同样类型的事情,我将概述我的方法。此答案仅适用于紧急情况。
这是一个视图模型...
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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
构造函数采用 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>
Run Code Online (Sandbox Code Playgroud)
这是一个 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;
}
}
Run Code Online (Sandbox Code Playgroud)
当您有数据表和紧急情况时,这应该可以让您回到过滤和呈现的正轨。所有编码大约需要一个小时。另请注意,我的绑定到Rows ,但如果需要,您也可以绑定到DefaultView 。
| 归档时间: |
|
| 查看次数: |
7738 次 |
| 最近记录: |