无法使用 MVVM 中的组合框文本过滤特定的 WPF 数据网格
Cannot filter specific WPF datagrid using combo box text in MVVM
我的 WPF 应用程序有两个 Tabitem 和一个带有 table 的 SQLite 数据库,名为 studentdata
,它有多个列。
在第一个 tabitem 中有一个名为 dg1
的数据网格、一个组合框和一个按钮。第二个 tabitem 目前只有一个名为 dg2
的数据网格,它应该显示一些过滤后的数据,为了简单起见,它的 PaidFeesOn
列是空白的,只有那些行应该显示在 dg2
中。组合框也应填写唯一的学生姓名。
虽然 dg1
在应用程序加载时应该显示所有数据,但是当从组合框中 select 编辑一个项目然后按下按钮时 dg1
应该显示只有那些 Name
列值与组合框 selected 项匹配的数据。
现在为了使用组合框文本过滤数据网格,我在视图模型中完成了以下操作:
public RelayCommand ComboFilterButtonClicked { get; set; }
public CollectionView ComboFilterView { get; set; }
public List<Students> _myitems;
public List<Students> MyItems
{
get { return _myitems; }
set { _myitems = value; }
}
public StudentsViewModel()
{
//........
ComboFilterButtonClicked = new RelayCommand(ComboFilterData);
MyItems = GetStudents();
ComboItems = CollectionViewSource.GetDefaultView(MyItems);
ComboFilterView = (CollectionView)CollectionViewSource.GetDefaultView(SData);
ComboFilterView.Filter = OnComboFilterTriggered;
}
public bool OnComboFilterTriggered(object item)
{
var lookup = item as Students;
if (lookup != null)
{
string x = "";
if (!string.IsNullOrEmpty(ComboText))
return (lookup.Name == x);
}
return true;
}
public void ComboFilterData(object param)
{
CollectionViewSource.GetDefaultView(MyItems).Refresh();
}
和组合框的 XAML:
<ComboBox IsEditable="True" Width="300"
ItemsSource="{Binding ComboItems}" DisplayMemberPath="Name"
Text="{Binding ComboText,Mode=TwoWay}">
</ComboBox>
但是当我的应用程序加载 dg1
数据网格时,当我 select 组合框中的项目时,组合框文本显示 System.Collections.Generic.List``1[filterDGs.MainWindow+Students]
之类的文本,这是由于(我相信..) return GetStudents().ToString();
在 ComboText
的 get
里面,但是 get
应该包含什么?
注意:我也在尝试向组合框添加组合框自动完成 suggestappend(如 winforms)功能。
我分享完整的代码 here 是为了更好地理解和测试(如果有人愿意的话)。
谁能帮我解决这个问题?
将视图模型中的 ComboText
属性 替换为包含当前选定 Students
对象的 属性:
private Students _selectedStudent;
public Students SelectedStudent
{
get
{
return _selectedStudent;
}
set
{
_selectedStudent = value;
OnPropertyChanged(nameof(SelectedStudent));
}
}
public bool OnComboFilterTriggered(object item)
{
var lookup = item as Students;
return lookup != null
&& !string.IsNullOrEmpty(_selectedStudent?.Name)
&& lookup.Name == _selectedStudent.Name;
}
public void ComboFilterData(object param)
{
CollectionViewSource.GetDefaultView(MyItems).Filter = OnComboFilterTriggered;
}
将 ComboBox
的 SelectedItem
属性 绑定到此 属性:
<ComboBox IsEditable="True" Width="300"
ItemsSource="{Binding ComboItems}" DisplayMemberPath="Name"
SelectedItem="{Binding SelectedStudent}">
我的 WPF 应用程序有两个 Tabitem 和一个带有 table 的 SQLite 数据库,名为 studentdata
,它有多个列。
在第一个 tabitem 中有一个名为 dg1
的数据网格、一个组合框和一个按钮。第二个 tabitem 目前只有一个名为 dg2
的数据网格,它应该显示一些过滤后的数据,为了简单起见,它的 PaidFeesOn
列是空白的,只有那些行应该显示在 dg2
中。组合框也应填写唯一的学生姓名。
虽然 dg1
在应用程序加载时应该显示所有数据,但是当从组合框中 select 编辑一个项目然后按下按钮时 dg1
应该显示只有那些 Name
列值与组合框 selected 项匹配的数据。
现在为了使用组合框文本过滤数据网格,我在视图模型中完成了以下操作:
public RelayCommand ComboFilterButtonClicked { get; set; }
public CollectionView ComboFilterView { get; set; }
public List<Students> _myitems;
public List<Students> MyItems
{
get { return _myitems; }
set { _myitems = value; }
}
public StudentsViewModel()
{
//........
ComboFilterButtonClicked = new RelayCommand(ComboFilterData);
MyItems = GetStudents();
ComboItems = CollectionViewSource.GetDefaultView(MyItems);
ComboFilterView = (CollectionView)CollectionViewSource.GetDefaultView(SData);
ComboFilterView.Filter = OnComboFilterTriggered;
}
public bool OnComboFilterTriggered(object item)
{
var lookup = item as Students;
if (lookup != null)
{
string x = "";
if (!string.IsNullOrEmpty(ComboText))
return (lookup.Name == x);
}
return true;
}
public void ComboFilterData(object param)
{
CollectionViewSource.GetDefaultView(MyItems).Refresh();
}
和组合框的 XAML:
<ComboBox IsEditable="True" Width="300"
ItemsSource="{Binding ComboItems}" DisplayMemberPath="Name"
Text="{Binding ComboText,Mode=TwoWay}">
</ComboBox>
但是当我的应用程序加载 dg1
数据网格时,当我 select 组合框中的项目时,组合框文本显示 System.Collections.Generic.List``1[filterDGs.MainWindow+Students]
之类的文本,这是由于(我相信..) return GetStudents().ToString();
在 ComboText
的 get
里面,但是 get
应该包含什么?
注意:我也在尝试向组合框添加组合框自动完成 suggestappend(如 winforms)功能。
我分享完整的代码 here 是为了更好地理解和测试(如果有人愿意的话)。
谁能帮我解决这个问题?
将视图模型中的 ComboText
属性 替换为包含当前选定 Students
对象的 属性:
private Students _selectedStudent;
public Students SelectedStudent
{
get
{
return _selectedStudent;
}
set
{
_selectedStudent = value;
OnPropertyChanged(nameof(SelectedStudent));
}
}
public bool OnComboFilterTriggered(object item)
{
var lookup = item as Students;
return lookup != null
&& !string.IsNullOrEmpty(_selectedStudent?.Name)
&& lookup.Name == _selectedStudent.Name;
}
public void ComboFilterData(object param)
{
CollectionViewSource.GetDefaultView(MyItems).Filter = OnComboFilterTriggered;
}
将 ComboBox
的 SelectedItem
属性 绑定到此 属性:
<ComboBox IsEditable="True" Width="300"
ItemsSource="{Binding ComboItems}" DisplayMemberPath="Name"
SelectedItem="{Binding SelectedStudent}">