C# 当用户键入文本框时,Setter未触发

C# 当用户键入文本框时,Setter未触发,c#,wpf,C#,Wpf,我试图根据用户在文本框中键入的内容筛选列表。但是,当用户输入框时,什么也没有发生。在调试过程中,我为这个绑定在setter上放置了断点,但它们不会触发 文本框定义: <TextBox HorizontalAlignment="Center" Text="{Binding TESTSerialNumbSearchTerm, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" ToolTip="Filter Part Number" Width

我试图根据用户在文本框中键入的内容筛选列表。但是,当用户输入框时,什么也没有发生。在调试过程中,我为这个绑定在setter上放置了断点,但它们不会触发

文本框定义:

<TextBox HorizontalAlignment="Center" Text="{Binding TESTSerialNumbSearchTerm, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" ToolTip="Filter Part Number" Width="180"/>
网格定义,带有ItemSource:

<DataGrid MaxHeight="400" Grid.Row="0" ItemsSource="{Binding VisibleProfiles}" SelectedItem="{Binding SelectedProfile}" SelectionMode="Single" IsReadOnly="True" AutoGenerateColumns="False" VerticalScrollBarVisibility="Visible">

过滤器列表方法:

public List<DongleProfile> FilterList(List<DongleProfile> inputList, Tuple<string, string> filter)
{
    List<DongleProfile> newList = new List<DongleProfile>();
    foreach (DongleProfile item in inputList)
    {
        switch (filter.Item1)
        {
            case "serialNumber":
                if (item.SerialNumberPrefix.Contains(filter.Item2))
                {
                    newList.Add(item);
                }
                break;
                // Similar cases
        }
    }
    return newList;
}
公共列表过滤器列表(列表输入列表、元组过滤器)
{
List newList=新列表();
foreach(输入列表中的DongleProfile项)
{
开关(过滤器项目1)
{
案例“序列号”:
if(item.SerialNumberPrefix.Contains(filter.Item2))
{
新建列表。添加(项);
}
打破
//类似案例
}
}
返回newList;
}

尝试以下想法:

用于过滤文本框的公共字段

public string md_FilterString
        {
            get { return _FilterString; }
            set
            {
                if (_FilterString != value)
                {
                    _FilterString = value;
                    mf_MakeView();
                    OnPropertyChanged("md_FilterString");
                }
            }
        }
datagrid绑定的公共字段:

public ICollectionView md_LogEntriesStoreView { get; private set; }
XAML:

其中d_项-直接是将显示在控制数据网格中的可观察集合的元素

过滤函数(mf_UserFilter)一般用于包含文本字段的对象。出于优化目的,您可以将其替换为您自己的版本,以适应您的目标:

private bool mf_UserFilter(object item)
        {
            string s = md_FilterString;
            if (String.IsNullOrWhiteSpace(s))
                return true;
            else
            {
                var srcT = item.GetType();
                foreach (var f in srcT.GetFields())
                {
                    string str = f.GetValue(item) as string;
                    if (String.IsNullOrWhiteSpace(str)) continue;
                    bool b = str.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0;
                    if (b) return true;
                }
                foreach (var f in srcT.GetProperties())
                {
                    string str = f.GetValue(item, null) as string;
                    if (String.IsNullOrWhiteSpace(str)) continue;
                    bool b = str.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0;
                    if (b) return true;
                }

                return false;
            }
        }
更新: 全文: 代码部分:

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainWindow_ModelView();
        }
    }

    public class MainWindow_ModelView : NotifyBase
    {
        private string _FilterString = String.Empty;

        public ObservableCollection<ItemClass> d_Items { get; set; }
        public ICollectionView md_LogEntriesStoreView { get; private set; }

        public string md_FilterString
        {
            get { return _FilterString; }
            set
            {
                if (_FilterString != value)
                {
                    _FilterString = value;
                    mf_MakeView();
                    OnPropertyChanged("md_FilterString");
                }
            }
        }

        public MainWindow_ModelView()
        {
            d_Items = new ObservableCollection<ItemClass>() { new ItemClass() { d_Text1 = "Item1Text1", d_Text2 = "Item1Text2" }, 
                new ItemClass() { d_Text1 = "Item2Text1", d_Text2 = "Item2Text2" }, 
                new ItemClass() { d_Text1 = "Item3Text1", d_Text2 = "Item3Text2" } };

            md_LogEntriesStoreView = CollectionViewSource.GetDefaultView(d_Items);
        }

        private void mf_MakeView()
        {
            if (d_Items == null) return;
            md_LogEntriesStoreView = CollectionViewSource.GetDefaultView(d_Items);
            md_LogEntriesStoreView.Filter = mf_UserFilter;
            OnPropertyChanged("md_LogEntriesStoreView");
        }
        private bool mf_UserFilter(object item)
        {
            string s = _FilterString;
            if (String.IsNullOrWhiteSpace(s))
                return true;
            else
            {
                var srcT = item.GetType();
                foreach (var f in srcT.GetFields())
                {
                    string str = f.GetValue(item) as string;
                    if (String.IsNullOrWhiteSpace(str)) continue;
                    bool b = str.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0;
                    if (b) return true;
                }
                foreach (var f in srcT.GetProperties())
                {
                    string str = f.GetValue(item, null) as string;
                    if (String.IsNullOrWhiteSpace(str)) continue;
                    bool b = str.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0;
                    if (b) return true;
                }

                return false;
            }
        }
    }

    public class ItemClass : NotifyBase
    {
        public string d_Text1 { get; set; }
        public string d_Text2 { get; set; }
    }

    public class NotifyBase : INotifyPropertyChanged
    {
        Guid id = Guid.NewGuid();

        [Browsable(false)]
        [System.Xml.Serialization.XmlAttribute("ID")]
        public Guid ID
        {
            get { return id; }
            set
            {
                if (id != value)
                {
                    id = value;
                    OnPropertyChanged("ID");
                }
            }
        }

        [field: NonSerialized]
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
    }
命名空间WpfApplication2
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
this.DataContext=新的主窗口_ModelView();
}
}
公共类主窗口\u模型视图:NotifyBase
{
私有字符串_FilterString=string.Empty;
公共可观测集合d_项{get;set;}
public ICollectionView md_LogEntriesStoreView{get;private set;}
公共字符串md_FilterString
{
获取{return\u FilterString;}
设置
{
if(_FilterString!=值)
{
_FilterString=值;
mf_MakeView();
OnPropertyChanged(“md_FilterString”);
}
}
}
公共主窗口_ModelView()
{
d_Items=newobserveCollection(){new ItemClass(){d_Text1=“Item1Text1”,d_Text2=“Item1Text2”},
新的ItemClass(){d_Text1=“Item2Text1”,d_Text2=“Item2Text2”},
新的ItemClass(){d_Text1=“Item3Text1”,d_Text2=“Item3Text2”};
md_LogEntriesStoreView=CollectionViewSource.GetDefaultView(d_项);
}
私有void mf_MakeView()
{
如果(d_Items==null)返回;
md_LogEntriesStoreView=CollectionViewSource.GetDefaultView(d_项);
md_LogEntriesStoreView.Filter=mf_UserFilter;
OnPropertyChanged(“md_LogEntriesStoreView”);
}
私有bool mf_UserFilter(对象项)
{
字符串s=\u过滤器字符串;
if(String.IsNullOrWhiteSpace)
返回true;
其他的
{
var srcT=item.GetType();
foreach(srcT.GetFields()中的var f)
{
字符串str=f.GetValue(项)作为字符串;
如果(String.IsNullOrWhiteSpace(str))继续;
bool b=str.IndexOf(s,StringComparison.OrdinalIgnoreCase)>=0;
如果(b)返回true;
}
foreach(srcT.GetProperties()中的var f)
{
string str=f.GetValue(item,null)作为字符串;
如果(String.IsNullOrWhiteSpace(str))继续;
bool b=str.IndexOf(s,StringComparison.OrdinalIgnoreCase)>=0;
如果(b)返回true;
}
返回false;
}
}
}
公共类ItemClass:NotifyBase
{
公共字符串d_Text1{get;set;}
公共字符串d_Text2{get;set;}
}
公共类NotifyBase:INotifyPropertyChanged
{
Guid id=Guid.NewGuid();
[可浏览(错误)]
[System.Xml.Serialization.XmlAttribute(“ID”)]
公共Guid ID
{
获取{return id;}
设置
{
if(id!=值)
{
id=值;
OnPropertyChanged(“ID”);
}
}
}
[字段:非序列化]
公共事件属性更改事件处理程序属性更改;
公共void OnPropertyChanged(字符串信息)
{
if(PropertyChanged!=null)
{
PropertyChanged(此,新PropertyChangedEventArgs(信息));
}
}
}
XAML部分:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <TextBox Height="23"
                 Text="{Binding md_FilterString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                 HorizontalAlignment="Stretch"
                 Name="textBox1"
                 Margin="2"
                 VerticalAlignment="Top"/>
        <DataGrid ItemsSource="{Binding md_LogEntriesStoreView}"
                  AutoGenerateColumns="False"
                  Grid.Row="1"
                  Margin="2"
                  HorizontalAlignment="Stretch"
                  Name="dataGrid1"
                  VerticalAlignment="Stretch">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Path = d_Text1}"
                                Width="Auto"
                                IsReadOnly="True"/>
                <DataGridTextColumn Binding="{Binding Path = d_Text2}"
                                    Width="*"
                                    IsReadOnly="True" />
             </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

结果:


尝试以下想法:

用于过滤文本框的公共字段

public string md_FilterString
        {
            get { return _FilterString; }
            set
            {
                if (_FilterString != value)
                {
                    _FilterString = value;
                    mf_MakeView();
                    OnPropertyChanged("md_FilterString");
                }
            }
        }
datagrid绑定的公共字段:

public ICollectionView md_LogEntriesStoreView { get; private set; }
XAML:

其中d_项-直接是将显示在控制数据网格中的可观察集合的元素

过滤函数(mf_UserFilter)是针对包含文本字段的对象以一般方式提供的。为了优化目的,您可以将其替换为您自己的版本,以适应您的目标:

private bool mf_UserFilter(object item)
        {
            string s = md_FilterString;
            if (String.IsNullOrWhiteSpace(s))
                return true;
            else
            {
                var srcT = item.GetType();
                foreach (var f in srcT.GetFields())
                {
                    string str = f.GetValue(item) as string;
                    if (String.IsNullOrWhiteSpace(str)) continue;
                    bool b = str.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0;
                    if (b) return true;
                }
                foreach (var f in srcT.GetProperties())
                {
                    string str = f.GetValue(item, null) as string;
                    if (String.IsNullOrWhiteSpace(str)) continue;
                    bool b = str.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0;
                    if (b) return true;
                }

                return false;
            }
        }
更新: 全文: 代码部分:

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainWindow_ModelView();
        }
    }

    public class MainWindow_ModelView : NotifyBase
    {
        private string _FilterString = String.Empty;

        public ObservableCollection<ItemClass> d_Items { get; set; }
        public ICollectionView md_LogEntriesStoreView { get; private set; }

        public string md_FilterString
        {
            get { return _FilterString; }
            set
            {
                if (_FilterString != value)
                {
                    _FilterString = value;
                    mf_MakeView();
                    OnPropertyChanged("md_FilterString");
                }
            }
        }

        public MainWindow_ModelView()
        {
            d_Items = new ObservableCollection<ItemClass>() { new ItemClass() { d_Text1 = "Item1Text1", d_Text2 = "Item1Text2" }, 
                new ItemClass() { d_Text1 = "Item2Text1", d_Text2 = "Item2Text2" }, 
                new ItemClass() { d_Text1 = "Item3Text1", d_Text2 = "Item3Text2" } };

            md_LogEntriesStoreView = CollectionViewSource.GetDefaultView(d_Items);
        }

        private void mf_MakeView()
        {
            if (d_Items == null) return;
            md_LogEntriesStoreView = CollectionViewSource.GetDefaultView(d_Items);
            md_LogEntriesStoreView.Filter = mf_UserFilter;
            OnPropertyChanged("md_LogEntriesStoreView");
        }
        private bool mf_UserFilter(object item)
        {
            string s = _FilterString;
            if (String.IsNullOrWhiteSpace(s))
                return true;
            else
            {
                var srcT = item.GetType();
                foreach (var f in srcT.GetFields())
                {
                    string str = f.GetValue(item) as string;
                    if (String.IsNullOrWhiteSpace(str)) continue;
                    bool b = str.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0;
                    if (b) return true;
                }
                foreach (var f in srcT.GetProperties())
                {
                    string str = f.GetValue(item, null) as string;
                    if (String.IsNullOrWhiteSpace(str)) continue;
                    bool b = str.IndexOf(s, StringComparison.OrdinalIgnoreCase) >= 0;
                    if (b) return true;
                }

                return false;
            }
        }
    }

    public class ItemClass : NotifyBase
    {
        public string d_Text1 { get; set; }
        public string d_Text2 { get; set; }
    }

    public class NotifyBase : INotifyPropertyChanged
    {
        Guid id = Guid.NewGuid();

        [Browsable(false)]
        [System.Xml.Serialization.XmlAttribute("ID")]
        public Guid ID
        {
            get { return id; }
            set
            {
                if (id != value)
                {
                    id = value;
                    OnPropertyChanged("ID");
                }
            }
        }

        [field: NonSerialized]
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
    }
命名空间WpfApplication2
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
this.DataContext=新的主窗口_ModelView();
}
}
公共类主窗口\u模型视图:NotifyBase
{
私有字符串_FilterString=string.Empty;
P