无法使用 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();ComboTextget 里面,但是 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;
}

ComboBoxSelectedItem 属性 绑定到此 属性:

<ComboBox IsEditable="True" Width="300"
    ItemsSource="{Binding ComboItems}" DisplayMemberPath="Name"
    SelectedItem="{Binding SelectedStudent}">