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