将ObservableCollection过滤到多个列表框

时间:2015-01-28 11:43:40

标签: c# wpf mvvm observablecollection collectionviewsource

在我的项目中,我目前在ObservableCollection构造函数中填充了ViewModel。此ObservableCollection包含一个自定义对象,该对象具有两个属性(两个字符串)。

目前,XAML / View对应文件夹有两个单独的列表框,这两个列表框都绑定到DataTemplate,用于选择要在ListBox中显示为条目的属性。在这种情况下,它会显示'propertyOne'。

是否可以让DataTemplate根据'propertyTwo'的内容选择每个ListBox项目所在的位置?

我已经查看了类似于我的情况的示例,它使用了CollectionViewSource,但我不太清楚如何将其实现到我的项目中,因为我对使用WPF并遵循MVVM结构相当新。这会涉及在View后面的代码中创建过滤器事件吗?

下面列出的是我的代码片段,我认为这对我的问题有用。任何有关解决这个问题的帮助都将非常感激。

查看

<Window.Resources>
    <DataTemplate x:Key="ListBoxTemplate">
        <StackPanel>
            <TextBlock Text="{Binding Path=propertyOne}" />
        </StackPanel>
    </DataTemplate> 
</Window.Resources>

<ListBox x:Name="ListBoxOne"
         Height="Auto"
         Width="Auto"
         ItemsSource="{Binding TestCollection}"
         ItemTemplate="{StaticResource ListBoxTemplate}" />

<ListBox x:Name="ListBoxTwo"
         Height="Auto"
         Width="Auto"
         ItemsSource="{Binding TestCollection}"
         ItemTemplate="{StaticResource ListBoxTemplate}" />     

视图模型

public class ViewModel
{
    public ObservableCollection<Item> TestCollection { get; set; }

    public ViewModel()
    {
        //populates the collection from an XML file
        //with propertyOne & propertyTwo for each item

        TestCollection = CustomObjectClass.DeserializeToColl<Item>("path");
    }
}

CustomObjectClass

public class CustomObjectClass
{
    public string propertyOne { get; set; }
    public string propertyTwo { get; set; }
}

1 个答案:

答案 0 :(得分:1)

<DataTemplate x:Key="ListBoxTemplate">
        <StackPanel>
            <StackPanel.Style>
                <Style>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=propertyTwo}" Value="read">
                            <Setter Property="StackPanel.Visibility" Value="Collapsed"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Style>
            <TextBlock Text="{Binding Path=propertyOne}" />
        </StackPanel>
    </DataTemplate>