【问题标题】:TextBox content doesn't bind to source WPF DataGridTextBox 内容未绑定到源 WPF DataGrid
【发布时间】:2021-09-07 11:43:52
【问题描述】:

我是 WPF 新手,遇到了一个问题。 我有一个 MVVM WPF 应用程序,我想对我的 DataGrid 实施过滤。我在互联网上尝试了所有可能的解决方案,但由于某种原因,它们都不适合我。我创建了一个 TextBox 并将其绑定到 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 设置为“fi”(_data 中的名称是“first”和“second”)并且它正确过滤了 DataGrid,但是当我尝试使用 TextBox 过滤它时没有任何反应。

标签: c# wpf datagrid


【解决方案1】:

如果具有FilterName 属性的视图模型是父窗口的DataContext,则此绑定应该有效:

Text="{Binding DataContext.FilterName, UpdateSourceTrigger=PropertyChanged, 
        RelativeSource={RelativeSource AncestorType=Window}}"

【讨论】:

    【解决方案2】:
    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. FilterName 设置器中删除 DataCollectionView.Refresh(); 调用,但添加
    private void FilterName_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
    {
        DataCollectionView.Refresh();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 2013-06-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      相关资源
      最近更新 更多