【发布时间】:2021-09-07 11:43:52
【问题描述】:
我是 WPF 新手,遇到了一个问题。
我有一个 MVVM WPF 应用程序,我想对我的 DataGrid 实施过滤。我在互联网上尝试了所有可能的解决方案,但由于某种原因,它们都不适合我。我创建了一个 TextBox 并将其绑定到 FilterName。我想要它做的是在每次按键时,FilterName 的值应该被更新并且过滤器应该被触发。不幸的是,过滤器只触发一次——当我启动应用程序并在FilterName 的Set 块中放置一个断点时,我发现它永远不会到达它。
下面是 TextBox 的声明:
<TextBox
x:Name="FilterName"
MinWidth="150"
Margin="{StaticResource SmallTopBottomMargin}"
Background="Transparent"
BorderThickness="0,0,0,1"
Text="{Binding FilterName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, IsAsync=True}"
TextWrapping="Wrap" />
这里是 ViewModel:
private readonly ObservableCollection<PersonData> _data;
public ICollectionView DataCollectionView { get; }
private string _filterName = string.Empty;
public string FilterName
{
get
{
return _filterName;
}
set
{
_filterName = value;
DataCollectionView.Refresh();
}
}
public MainWindowViewModel(ISampleDataService sampleDataService)
{
//Adding the data here
DataCollectionView = CollectionViewSource.GetDefaultView(_data);
DataCollectionView.Filter = FilterByName;
}
private bool FilterByName(object obj)
{
if (obj is PersonData data)
{
return data.Name.Contains(FilterName, StringComparison.InvariantCultureIgnoreCase);
}
return false;
}
【问题讨论】:
-
看起来你的问题实际上只是一个绑定问题,与过滤和数据网格无关,对吧?您确定拥有您认为拥有的视图模型吗?
-
是的,我相信一切都是正确的,但是数据没有绑定。我在声明时尝试将 _filterName 设置为“fi”(_data 中的名称是“first”和“second”)并且它正确过滤了 DataGrid,但是当我尝试使用 TextBox 过滤它时没有任何反应。