WPF Datagrid动态列头TextBox筛选器输入内容同步重复问题咨询
问题根因
你当前所有列头的TextBox都绑定到了ViewModel中同一个TextFilterColumn属性,任意一个文本框的输入都会修改这个全局属性,所有文本框同步监听这个属性变更,自然所有列都会显示相同内容。
解决方案
推荐使用附加属性存储每个列独立的筛选值,不需要修改原有ViewModel结构,完美适配动态列场景:
步骤1:定义列筛选值的附加属性
新建静态类存储DataGridColumn的扩展附加属性,每个列会独享一份属性值:
using System.Windows; using System.Windows.Controls; public static class DataGridColumnFilterExtension { public static readonly DependencyProperty FilterTextProperty = DependencyProperty.RegisterAttached( "FilterText", typeof(string), typeof(DataGridColumnFilterExtension), new PropertyMetadata(string.Empty) ); public static void SetFilterText(DependencyObject column, string value) => column.SetValue(FilterTextProperty, value); public static string GetFilterText(DependencyObject column) => (string)column.GetValue(FilterTextProperty); }
步骤2:修改列头模板的TextBox绑定
将TextBox的绑定改为关联当前列自己的附加属性,无需绑定全局ViewModel字段:
<TextBox Width="100" Margin="5" Text="{Binding Path=Column.(local:DataGridColumnFilterExtension.FilterText), RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
注意:
local是你附加属性类所在命名空间的XAML别名,需要在你的XAML根节点声明对应命名空间,比如xmlns:local="clr-namespace:你的项目命名空间"
步骤3:修改Filter命令的参数传递
调整Hyperlink的CommandParameter,直接传递当前列对象,方便命令中同时获取列名和对应筛选值:
<Hyperlink Foreground="White" Command="{Binding DataContext.FilterColumnName, RelativeSource={RelativeSource AncestorType=Window}}" CommandParameter="{Binding Path=Column, RelativeSource={RelativeSource TemplatedParent}}"> Filter </Hyperlink>
步骤4:调整筛选命令的执行逻辑
修改ViewModel中的筛选命令逻辑,从传入的列对象中获取筛选值:
// 假设你的Filter命令是RelayCommand/DelegateCommand实现 private void OnFilterExecute(object parameter) { if (parameter is not DataGridColumn targetColumn) return; // 获取当前列的列名和筛选输入值 string columnName = targetColumn.Header?.ToString(); string filterInput = DataGridColumnFilterExtension.GetFilterText(targetColumn); // 原有筛选逻辑不变,替换原来的TextFilterColumn为这里的filterInput即可 }
刷新列时的额外处理
每次重新生成DataGrid列时,新列的附加属性默认是空字符串,文本框会自动显示为空,不会残留之前的筛选值。如果需要保留刷新前的筛选值,可以在重新生成列时,把旧列的FilterText值赋值给新生成的对应列即可。
内容的提问来源于stack exchange,提问作者Manu
相关产品推荐
相关产品推荐

