通过CollectionViewSource

时间:2016-07-27 20:33:41

标签: c# wpf xaml mvvm listbox

我有一个工具箱(Visual Studio一样)和一个用户可以过滤的文本框。过滤器正在运行,但ListBox中的项目始终未展开

View.xaml

<ListBox x:Name="ListBox" Grid.Row="1" ItemsSource="{Binding Items}" 
             PreviewMouseLeftButtonDown="OnListBoxPreviewMouseLeftButtonDown" MouseMove="OnListBoxMouseMove"
             Background="Transparent" BorderThickness="0" ScrollViewer.CanContentScroll="False">
        <ListBox.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <gem:ExpanderEx Header="{Binding Name}" IsExpanded="{Binding IsSelected, Mode=TwoWay}">
                                        <ItemsPresenter />
                                    </gem:ExpanderEx>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock FontWeight="Bold" FontSize="15"
                                   Text="{Binding Path=Name}"/>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </ListBox.GroupStyle>
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Margin="18 0 0 0" ToolTip="{Binding Help}">
                    <Image Source="{Binding IconSource, Converter={StaticResource NullableValueConverter}}" Margin="0 0 5 0" Width="16" />
                    <TextBlock Text="{Binding Name}" Padding="2" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

ViewModel.cs

items = new BindableCollection<ToolboxItemViewModel>();
        collectionView = CollectionViewSource.GetDefaultView(items);
        collectionView.GroupDescriptions.Add(new PropertyGroupDescription("Category"));
        collectionView.GroupDescriptions.Add(new PropertyGroupDescription("SubCategory"));
        collectionView.Filter = ToolBoxFilter;

    private readonly BindableCollection<ToolboxItemViewModel> items;
    public IObservableCollection<ToolboxItemViewModel> Items { get { return items; } }

    private string searchTerm;
    public string SearchTerm
    {
        get { return searchTerm; }
        set
        {
            if (searchTerm == value)
                return;

            searchTerm = value;
            NotifyOfPropertyChange(() => SearchTerm);

            //TODO: implement a defer here (Rx Extensions might help)
            collectionView.Refresh(); //Refresh the filter.
        }
    }

ToolBoxItem.cs

public class ToolboxItemViewModel : PropertyChangedBase
{
    private readonly ToolboxItem model;

    public ToolboxItemViewModel(ToolboxItem model)
    {
        this.model = model;
        IsSelected = false;
    }

    public ToolboxItem Model
    {
        get { return model; }
    }

    public string Name
    {
        get { return model.Name; }
    }

    public string Category
    {
        get { return model.Category; }
    }

    public string SubCategory
    {
        get { return model.SubCategory; }
    }


    private bool isSelected;
    public bool IsSelected
    {
        get { return isSelected; }
        set
        {
            isSelected = value;
            NotifyOfPropertyChange(() => IsSelected);
        }
    }

Toolbox filtered example

如何在过滤时展开分组的项目?

或者另一种方法,如果内部选择了任何ListboxItem,如何扩展组项。

修改

试图找出它,结果我在gem:ExpanderEx IsExpanded="{Binding IsSelected}"

上有一个绑定错误

BindingExpression路径错误'IsSelected'属性在'object''找不到'CollectionViewGroupInternal'

1 个答案:

答案 0 :(得分:0)

collectionView过滤条件中,添加yourObject.IsSelected = true;

如果在过滤器中返回true,则可以更改ToolboxItemViewModel对象的属性。

bool ToolBoxFilter(object item)
{
    if (Search Criteria Match)
    {
        ToolboxItemViewModel model = (ToolboxItemViewModel)item;
        model.IsSelected = true;
        ... rest of your code
    }    
}