2016-07-27 2 views
0

도구 상자 (Visual Studio와 유사) 및 사용자가 필터링 할 수있는 텍스트 상자가 있습니다. 필터가 작동하지만 ListBox의 항목은 항상 으로 확장되지 않습니다..CollectionViewSource를 통해 필터링 할 때 그룹화 된 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); 
     } 
    } 

필터링 할 때 어떻게 그룹화 된 항목을 확장 할 수 있습니까?

또 다른 방법은 내부에서 ListboxItem이 선택되어있는 경우 그룹 항목을 확장하는 것입니다.

을 알아 내려고 노력 편집

, 나는 '에 isSelected'속성 gem:ExpanderEx IsExpanded="{Binding IsSelected}"

BindingExpression 경로 오류에 바인딩 오류 '객체'CollectionViewGroupInternal '

에없는이 밝혀

답변

0

collectionView 필터에 yourObject.IsSelected = true;을 추가하십시오.

필터에서 true를 반환하면 ToolboxItemViewModel 개체에서 속성을 변경할 수 있습니다. ExpanderEx으로 IsExpanded = "{에 isSelected 바인딩} ''아마도 (? 아마도)이 문제이지만, 돈 '내가 바인딩 오류`보석을 발견했다

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

나는 그것을 시도하고 그것은 – JobaDiniz

+0

작동하지 않습니다 해결 방법을 안다 .. 내 질문을 수정했다. – JobaDiniz

관련 문제