文本框内容未绑定到源 WPF 数据网格



我是WPF的新手,遇到了一个问题。我有一个MVVM WPF应用程序,我想实现过滤到我的数据网格。我在网上尝试了所有可能的解决方案,但由于某种原因,它们都不适合我。我已经创建了一个文本框,并将其绑定到FilterName。我想要它做的是在每次按键上,FilterName的值应该被更新,过滤器应该被触发。不幸的是,过滤器只触发一次-当我启动应用程序并在FilterNameSet块中放置一个断点时,我发现它从未到达它。下面是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属性的视图模型是父窗口的DataContext,则该绑定应该可以工作:

Text="{Binding DataContext.FilterName, UpdateSourceTrigger=PropertyChanged, 
RelativeSource={RelativeSource AncestorType=Window}}"
  1. 设置您的窗口名称为x:Name="_this"并更改TextBox绑定:
<TextBox   
x:Name="tbFilterName"  
DataContext="{Binding ElementName=_this}"                 
Text="{Binding Path=FilterName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
TextChanged="FilterName_TextChanged"      
...
  1. FilterNamesetter中删除DataCollectionView.Refresh();调用,但添加
private void FilterName_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
DataCollectionView.Refresh();
}