C# 仅绑定具有特定属性的列表项

C# 仅绑定具有特定属性的列表项,c#,.net,wpf,data-binding,filtering,C#,.net,Wpf,Data Binding,Filtering,我有一个当前绑定到视图中的列表框的ObservableCollectionMyObject有一个enum属性,我们将启用和禁用它(以及其他属性)。使用绑定,是否有一种方法来过滤集合并只显示打开或关闭的项?您可能需要考虑a,或者在视图模型中执行筛选。 您可能想考虑一下,或者自己在视图模型中执行过滤。您应该了解其功能和过滤功能 如果要在纯MVVM中执行过滤,可以让viewmodel公开类型为ICollectionView的属性,应用所需的任何过滤器,然后从XAML绑定到该属性 视图模型: publi

我有一个当前绑定到视图中的列表框的
ObservableCollection
MyObject
有一个enum属性,我们将启用和禁用它(以及其他属性)。使用绑定,是否有一种方法来过滤集合并只显示打开或关闭的项?

您可能需要考虑a,或者在视图模型中执行筛选。

您可能想考虑一下,或者自己在视图模型中执行过滤。

您应该了解其功能和过滤功能

如果要在纯MVVM中执行过滤,可以让viewmodel公开类型为
ICollectionView
的属性,应用所需的任何过滤器,然后从XAML绑定到该属性

视图模型:

public ICollectionView MyCollectionView { get; set; }

public ViewModel()
{
    var items = new List<string>
    {
        "Apple",
        "Orange"
    };

    MyCollectionView = CollectionViewSource.GetDefaultView(items);

    // Will only display items starting with "A".
    MyCollectionView.Filter = item => ((string)item).StartsWith("A");
}
<ListBox ItemsSource="{Binding MyCollectionView}"/>
public ICollectionView MyCollectionView{get;set;}
公共视图模型()
{
var items=新列表
{
“苹果”,
“橙色”
};
MyCollectionView=CollectionViewSource.GetDefaultView(项目);
//将仅显示以“A”开头的项目。
MyCollectionView.Filter=item=>((字符串)item.StartsWith(“A”);
}
XAML:

public ICollectionView MyCollectionView { get; set; }

public ViewModel()
{
    var items = new List<string>
    {
        "Apple",
        "Orange"
    };

    MyCollectionView = CollectionViewSource.GetDefaultView(items);

    // Will only display items starting with "A".
    MyCollectionView.Filter = item => ((string)item).StartsWith("A");
}
<ListBox ItemsSource="{Binding MyCollectionView}"/>

您应该看看它的功能和过滤功能

如果要在纯MVVM中执行过滤,可以让viewmodel公开类型为
ICollectionView
的属性,应用所需的任何过滤器,然后从XAML绑定到该属性

视图模型:

public ICollectionView MyCollectionView { get; set; }

public ViewModel()
{
    var items = new List<string>
    {
        "Apple",
        "Orange"
    };

    MyCollectionView = CollectionViewSource.GetDefaultView(items);

    // Will only display items starting with "A".
    MyCollectionView.Filter = item => ((string)item).StartsWith("A");
}
<ListBox ItemsSource="{Binding MyCollectionView}"/>
public ICollectionView MyCollectionView{get;set;}
公共视图模型()
{
var items=新列表
{
“苹果”,
“橙色”
};
MyCollectionView=CollectionViewSource.GetDefaultView(项目);
//将仅显示以“A”开头的项目。
MyCollectionView.Filter=item=>((字符串)item.StartsWith(“A”);
}
XAML:

public ICollectionView MyCollectionView { get; set; }

public ViewModel()
{
    var items = new List<string>
    {
        "Apple",
        "Orange"
    };

    MyCollectionView = CollectionViewSource.GetDefaultView(items);

    // Will only display items starting with "A".
    MyCollectionView.Filter = item => ((string)item).StartsWith("A");
}
<ListBox ItemsSource="{Binding MyCollectionView}"/>


是否可以在纯XAML中过滤
CollectionViewSource
,或者是否需要代码隐藏?通过在viewmodel中进行过滤,您可以在纯MVVM中过滤集合,而不需要代码隐藏。查看我的更新答案。这很有效。我将不得不使用它来解决一些与我的代码相关的问题,但这肯定让我走上了正确的道路。谢谢是否可以在纯XAML中过滤
CollectionViewSource
,或者是否需要代码隐藏?通过在viewmodel中进行过滤,您可以在纯MVVM中过滤集合,而不需要代码隐藏。查看我的更新答案。这很有效。我将不得不使用它来解决一些与我的代码相关的问题,但这肯定让我走上了正确的道路。谢谢是否可以在纯XAML中过滤
CollectionViewSource
,还是需要代码隐藏?@DennisE:有时不需要更容易,但在XAML中可以做的任何事情都可以在代码隐藏中完成,反之亦然。@DennisE:简单的搜索会返回此信息。。。我试过了,但是在
行中,我得到了两个错误。第一个表示“成员”筛选器“不可识别或不可访问”。第二个表示“属性‘筛选器’没有值”。筛选器是一个事件(),因此如果在XAML中设置它,则假定处理程序位于该文件的代码后面。您应该考虑MVVM设计模式并尽量减少代码隐藏,因此请查看我的回答中提供的链接,了解如何在视图模型中进行过滤。是否可以用纯XAML过滤
CollectionViewSource
,或者您需要代码隐藏?@DennisE:有时不需要,但在XAML中可以做的任何事情都可以在代码隐藏中完成,反之亦然。@DennisE:一个简单的搜索会返回这个。。。我试过了,但是在
行中,我得到了两个错误。第一个表示“成员”筛选器“不可识别或不可访问”。第二个表示“属性‘筛选器’没有值”。筛选器是一个事件(),因此如果在XAML中设置它,则假定处理程序位于该文件的代码后面。您应该考虑MVVM设计模式并尽量减少背后的代码,因此请查看我的答案中提供的链接,了解如何在视图模型中进行过滤。