2016-07-27 7 views
0

Ich habe eine Toolbox (Visual Studio gleichermaßen) und ein Textfeld, in dem Benutzer filtern können. Der Filter funktioniert, aber die Einträge in der ListBox bleiben immer nicht erweitert.Erweitern gruppierten ListBox beim Filtern durch CollectionViewSource

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

Wie kann ich die gruppierten Elemente beim Filtern erweitern?

Oder ein anderer Ansatz, wie das Gruppenelement zu erweitern, wenn ListboxItem innerhalb ausgewählt ist.

EDIT

Des Versuch, es herauszufinden, stellt sich heraus, ich habe einen verbindlichen Fehler auf gem:ExpanderEx IsExpanded="{Binding IsSelected}"

Binding Wegfehlers 'IsSelected' Eigenschaft nicht auf 'Objekt' gefunden 'CollectionViewGroupInternal'

Antwort

0

Fügen Sie in Ihrem collectionView Filter yourObject.IsSelected = true; hinzu. Wenn Sie in Ihrem Filter true zurückgeben, können Sie die Eigenschaften Ihres ToolboxItemViewModel Objekts ändern.

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

Ich habe das versucht, und es nicht – JobaDiniz

+0

Ich habe einen verbindlichen Fehler 'gem gefunden funktioniert: ExpanderEx IsExpanded = "{IsSelected Binding}"' und vielleicht (? Vielleicht) das ist das Problem, aber don‘ t wissen, wie zu lösen .. Ich habe meine Frage bearbeiten – JobaDiniz

Verwandte Themen