2015-04-07 62 views
0

我在Combobox中有以下3个项目。根据在Combobox中选择的项目更改列表视图内容

    * All 

        * Item 1 

        * Item 2 

同时,我有一个像下面给出的列表视图。

   * Item 1 
         - Sub - Item 1 
         - Sub - Item 2 
         - Sub - Item 3 
       * Item 2 
         - Sub -Item 1 
         - Sub - Item 2 
         - Sub - Item 3 
         - Sub - Item 4 

我的要求是这样的。如果在组合框中选择的内容是“项目1”,那么在列表视图中显示的内容应该如下。

   * Item 1 
         - Sub - Item 1 
         - Sub - Item 2 
         - Sub - Item 3 

同样,如果在组合框中选择的内容是“项目2”,那么在lisview中显示的内容应该如下。

  * Item 2 
         - Sub -Item 1 
         - Sub - Item 2 
         - Sub - Item 3 
         - Sub - Item 4 

最后,如果选择“全部”,那么显然它应该显示以下内容。

  * Item 1 
         - Sub - Item 1 
         - Sub - Item 2 
         - Sub - Item 3 
      * Item 2 
         - Sub -Item 1 
         - Sub - Item 2 
         - Sub - Item 3 
         - Sub - Item 4 

有人可以建议一种方法来做到这一点吗?

+0

我已经尝试在cmboBox_SelectionChanged事件中首先清除列表视图。然后尝试将新项目源绑定到列表视图。在新项目源中,所选项目必须被删除。与那个拆除部分一起挣扎。 –

+0

我认为,如果你的数据结构是这样的:一个变量控股集团型(第1项,第2项),以及子项的列表,比它很容易。你只是说,如果组类型不等于选定的组,请将其删除。也许这是你的尝试? – WPMed

+0

令人困惑的是,这个过滤应该基于两个组合框值来完成。我已经完成了,因为我绑定到列表视图的对象列表包含在绑定到另一个组合框的另一个对象列表中。因此,使用该组合框进行筛选是可以的。但保持组合框的值(我上面发布的那个)是不可能的。我清除了ListView和检查“项目1”是否存在于列表视图的的ItemSource,如果它确实存在,那么我删除它,并试图将对象绑定到列表视图的新列表。但绑定不会发生。 –

回答

0

那么,我写了简单的实现,希望这是你所需要的。 将XAML代码到窗口:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <ComboBox 
     x:Name="MyCombo" 
     DisplayMemberPath="Name" 
     SelectedValuePath="Name" 
     SelectedIndex="0" 
     /> 
    <ListView 
     x:Name="MyList" 
     Grid.Row="1" 
     DisplayMemberPath="SubName" 
     > 
     <ListView.GroupStyle> 
      <GroupStyle> 
       <GroupStyle.HeaderTemplate> 
        <DataTemplate> 
         <TextBlock FontWeight="Bold" FontSize="14" Text="{Binding Name}"/> 
        </DataTemplate> 
       </GroupStyle.HeaderTemplate> 
      </GroupStyle> 
     </ListView.GroupStyle> 
    </ListView> 
</Grid> 

而一些后台代码:

public class MyItem 
{ 
    public string Name { get; set; } 
    public string SubName { get; set; } 
    public MyItem(string name, string subName) 
    { 
     Name = name; 
     SubName = subName; 
    } 
} 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var comboBoxItems = new List<MyItem>(); 
     comboBoxItems.Add(new MyItem("All", null)); 
     comboBoxItems.Add(new MyItem("Item 1", null)); 
     comboBoxItems.Add(new MyItem("Item 2", null)); 
     MyCombo.ItemsSource = comboBoxItems; 

     var listViewItems = new List<MyItem>(); 
     listViewItems.Add(new MyItem("Item 1", "SubItem 1.1")); 
     listViewItems.Add(new MyItem("Item 1", "SubItem 1.2")); 
     listViewItems.Add(new MyItem("Item 1", "SubItem 1.3")); 
     listViewItems.Add(new MyItem("Item 2", "SubItem 2.1")); 
     listViewItems.Add(new MyItem("Item 2", "SubItem 2.2")); 
     listViewItems.Add(new MyItem("Item 2", "SubItem 2.3")); 
     listViewItems.Add(new MyItem("Item 2", "SubItem 2.4")); 

     CollectionView view = (CollectionView) CollectionViewSource.GetDefaultView(listViewItems); 
     PropertyGroupDescription groupDescription = new PropertyGroupDescription("Name"); 
     view.GroupDescriptions.Add(groupDescription); 
     view.Filter = itemObject => 
      { 
       MyItem item = (MyItem) itemObject; 
       string comboName = (string) MyCombo.SelectedValue; 
       return item.Name == comboName || comboName == "All"; 
      }; 
     MyCombo.SelectionChanged += (s, e) => view.Refresh(); 
     MyList.ItemsSource = view; 
    } 
} 

主要在这里时刻的CollectionView类及其他相关类。这是正确的方式来处理ListView分组(据我所知)。

+0

我在你的项目中使用了你的代码。它会生成一个statckoverflow异常。我发现它正在发生的地方。这是最后一行。 MyList.ItemsSource = view;我已经在.xaml代码中设置了我的listview的项目源。 Itemsource是包含在另一个组合框的选定对象中的对象列表。你知道为什么会发生这种情况吗? –

+0

这是因为我写了我的代码没有你的代码部分与“我已经设置项目源...”。要查看完整的项目 - 在VS中创建空的WPF项目,然后将XAML代码粘贴到标记的内容中。然后将c#代码复制粘贴到windows代码隐藏中。这将起作用(如果需要 - 我可以将您的项目文件发送给您)。 我不知道 - 为什么我和你的合并代码无法正常工作。需要看到这个合并代码,尤其是如果你说“Itemsource是另一个组合框的选定对象中包含的对象列表” - 这是附加条件,并且适用代码是受欢迎的 – dzaraev

0

希望你已经为你的宣布课程项目子项目。然后,您需要将您的Items的集合绑定到MainWindow中的Combobox和SubItems到ListView。你需要做的是写你的代码ComboBox_SelectionChanged方法来重置ListView的当前ItemSource并绑定基于所选组合框项目的新项目源。

我试过这样的东西,Check here

相关问题