Wpf 基于属性值将ObservableCollection绑定到Listbox

Wpf 基于属性值将ObservableCollection绑定到Listbox,wpf,listview,data-binding,Wpf,Listview,Data Binding,我的模型是这样的: public class MyModel { public string Title { get; set; } public string BriefDescription { get; set; } public bool IsDirty { get; set; } } <ListView Name="lvwAvailableCollection" Grid.Row="0" Grid.Column="0" ItemsSource=

我的模型是这样的:

public class MyModel
{
   public string Title { get; set; }
   public string BriefDescription { get; set; }
   public bool IsDirty { get; set; }
}
        <ListView Name="lvwAvailableCollection" Grid.Row="0" Grid.Column="0" ItemsSource="{Binding Path=MyCollection}" IsSynchronizedWithCurrentItem="True" AlternationCount="2" MaxHeight="300" >
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="175" Header="Title" DisplayMemberBinding="{Binding Title}" />
                    <GridViewColumn Width="200" Header="Description" DisplayMemberBinding="{Binding BriefDescription}" />
                </GridView>
            </ListView.View>
        </ListView>
我在我的
ViewModel
中有一个属性,我正在用它投标
ListBox

    public ObservableCollection<ROCategoryModel> MyCollection { get; set; }

这在CollectionViewSources和几个非常小的代码隐藏事件处理程序中是可行的。主要基于Laurent Bugnon的帖子:

XAML:


这在CollectionViewSources和几个非常小的代码隐藏事件处理程序中是可行的。主要基于Laurent Bugnon的帖子:

XAML:


基于“IsDirty”属性在列表框中显示和隐藏项目如何?这样可以吗?基于“IsDirty”属性在列表框中显示和隐藏项目如何?这样可以吗?基于“IsDirty”属性在列表框中显示和隐藏项目如何?这对你合适吗?这必须是代码隐藏吗?我可以不将其放在ViewModel中吗?可以,但这可能会带来更大的麻烦:。是否必须将其放在代码隐藏中?我可以不将其放在ViewModel中吗?可以,但这可能会带来更大的麻烦:。是否必须将其放在代码隐藏中?我可以不把它放在ViewModel中吗?你可以,但这可能比它的价值更麻烦:。
<Window.Resources>
    <ResourceDictionary>
        <CollectionViewSource x:Key="CleanItems" Filter="CleanItems_Filter" Source="{Binding MyCollection}" />
        <CollectionViewSource x:Key="DirtyItems" Filter="DirtyItems_Filter" Source="{Binding MyCollection}" />
    </ResourceDictionary>
</Window.Resources>

<Grid x:Name="LayoutRoot">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <ListView Name="lvwAvailableCollectionClean" Grid.Column="0" ItemsSource="{Binding Source={StaticResource CleanItems}}" IsSynchronizedWithCurrentItem="True" AlternationCount="2" MaxHeight="300" >
        <ListView.View>
            <GridView>
                <GridViewColumn Width="175" Header="Title" DisplayMemberBinding="{Binding Title}" />
                <GridViewColumn Width="200" Header="Description" DisplayMemberBinding="{Binding BriefDescription}" />
            </GridView>
        </ListView.View>
    </ListView>

    <ListView Name="lvwAvailableCollectionDirty" Grid.Column="1" ItemsSource="{Binding Source={StaticResource DirtyItems}}" IsSynchronizedWithCurrentItem="True" AlternationCount="2" MaxHeight="300" >
        <ListView.View>
            <GridView>
                <GridViewColumn Width="175" Header="Title" DisplayMemberBinding="{Binding Title}" />
                <GridViewColumn Width="200" Header="Description" DisplayMemberBinding="{Binding BriefDescription}" />
            </GridView>
        </ListView.View>
    </ListView>

</Grid>
private void CleanItems_Filter(object sender, System.Windows.Data.FilterEventArgs e)
{
    var item = e.Item as MyModel; 
    if (!item.IsDirty) 
    { 
        e.Accepted = true; 
    } 
    else 
    { 
        e.Accepted = false; 
    }
}

private void DirtyItems_Filter(object sender, System.Windows.Data.FilterEventArgs e)
{
    var item = e.Item as MyModel;
    if (item.IsDirty)
    {
        e.Accepted = true;
    }
    else
    {
        e.Accepted = false;
    }
}