c# - WPF MVVM DataGrid 过滤使用组合框

标签 c# wpf xaml mvvm data-binding

我有一个带有 DataGrid 和 ComboBox 的 WPF MVVM 应用程序,它们绑定(bind)到 ViewModel 类中的相同实体列表。
我想通过 ComboBox 选择过滤 DataGrid 条目,这样做的正确方法是什么?由于我正在使用 MVVM,因此我想通过数据绑定(bind)来实现这一点,并避免后面出现无用的代码。

我的 XAML 代码如下

<DataGrid ItemsSource="{Binding Posts}" AutoGenerateColumns="False" IsReadOnly="True">
   <DataGrid.Columns>
      <DataGridTextColumn Header="Id" Binding="{Binding Id}" />
      <DataGridTextColumn Header="Title" Binding="{Binding Title}" />
      <DataGridTextColumn Header="BlogUrl" Binding="{Binding Blog.Url}" />
   </DataGrid.Columns>
</DataGrid>

<ComboBox ItemsSource="{Binding Posts}"
          DisplayMemberPath="Blog.Url" />

View 模型
public class MainWindowViewModel
{
    private SqliteDbContext context;
    public List<Post> Posts { get; set; }

    public MainWindowViewModel()
    {
        context = new SqliteDbContext();
        Posts = context.Posts.Include(p => p.Blog).ToList();
    }
}

此外,使用此代码,我的 ComboBox 显示了 Urls 的重复项,我如何区分这些值?

谢谢。

最佳答案

这应该可以解决问题。

查看型号 :

public class MainWindowViewModel
{
    private SqliteDbContext context;

    public ObservableCollection<Post> Posts { get; set; }
    private string _selectedUrl;
    public ICollectionView PostsView { get; set; }
    public MainWindowViewModel()
    {
        context = new SqliteDbContext();
        Posts = new ObservableCollection<Post>(context.Posts.Include(p => p.Blog));
        PostsView = new CollectionViewSource { Source = Posts }.View;
        PostsView.Filter = post => SelectedUrl == null || SelectedUrl == ((Post)post).Blog.Url;
    }

    public string SelectedUrl
    {
        get
        {
            return _selectedUrl;
        }
        set
        {
            _selectedUrl = value;
            PostsView.Refresh();
        }
    }
}  

XAML :
<DataGrid ItemsSource="{Binding PostsView}" AutoGenerateColumns="False" IsReadOnly="True">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Id" Binding="{Binding Id}" />
        <DataGridTextColumn Header="Title" Binding="{Binding Title}" />
        <DataGridTextColumn Header="BlogUrl" Binding="{Binding Blog.Url}" />
    </DataGrid.Columns>
</DataGrid>

<ComboBox ItemsSource="{Binding Posts}"
          DisplayMemberPath="Blog.Url" 
          SelectedValuePath="Blog.Url"
          SelectedValue="{Binding SelectedUrl}"/>

关于c# - WPF MVVM DataGrid 过滤使用组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43274007/

相关文章:

c# - 用纯 C# 代码编写的自定义 DataTemplate 的问题

c# - EditorFor 和 StringLength DataAnnotations

c# - 不在焦点时响应键盘? (C#, Vista)

c# - 你如何在 WPF 中组织你的模型/ View / View 模型

c# - 基于其他控件的 Gotfocus 显示控件的文本

wpf - 延迟加载 XAML

xaml - 如何将 Xamarin.Forms XAML UI 页面转换为 PDF 文件?

c# - WPF 用户控件依赖属性值

javascript - 过滤列表为空

c# - WPF 工具栏和 StackPanel 在裁剪时自动将 ClipToBounds ="True"