2017-01-23 184 views
1

我有一个列表视图包含文本块和另一个列表。 我想要当用户点击一个嵌套的listviewitem父列表视图也被选中。 示例: enter image description herewpf - 从嵌套列表视图选择项目也选择父列表视图

在上图中选择了Lista2(父列表项)。 用户从Lista1上点击Linia6来选择它。当选择来自Lista1的Linia6(嵌套列表项)时,还要选择Lista1(父列表项)。

此外,如果有可能做到这一点在后面的代码,而不是XAML

我的代码

<ListView ItemsSource="{Binding listsToDisplay}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled" Width="200"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Width="250" Text="{Binding listName}"></TextBlock> 
         <ListView ItemsSource="{Binding listContent}"> 
         </ListView> 
        </StackPanel> 

       </DataTemplate> 
      </ListView.ItemTemplate> 
+0

你能描述关于所需的选择行为的更多细节?从你的图片看起来,最后选择了“Lista1.Linia6”,但是你写的它也应该选择“Lista2”,所以我不太明白你想要什么。 – grek40

+0

对帖子进行了编辑并添加了以下信息:在上图中,选择了Lista2(父列表项)。用户从Lista1上点击Linia6来选择它。当选择来自Lista1的Linia6(嵌套列表项)时,还要选择Lista1(父列表项)。 –

+0

而应该'Lista2.Linia4'被取消选择(基本上,所有嵌套列表只有一个选择)? – grek40

回答

1

如果嵌套ListViewSelectedItem属性不使用通过其他方式,你可以将它绑定到其父母的ListViewItem.IsSelected,使用转换器。请注意,父列表视图上的SelectionMode="Single"对于避免转换器的重复选择很重要。

<Grid x:Name="grid1"> 
    <Grid.Resources> 
     <local:SelectedItemTransferConverter x:Key="ItemSelectedConverter"/> 
    </Grid.Resources> 
    <ListView ItemsSource="{Binding listsToDisplay}" SelectionMode="Single"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding listName}"/> 
        <ListView 
         ItemsSource="{Binding listContent}" 
         SelectedItem="{Binding IsSelected,RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}},Converter={StaticResource ItemSelectedConverter}}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
</Grid> 

转换器代码:

public class SelectedItemTransferConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is bool || value is bool?) 
     { 
      if ((bool?)value == false) 
      { 
       return null; 
      } 
     } 
     return Binding.DoNothing; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (targetType == typeof(bool) || targetType == typeof(bool?)) 
     { 
      return value != null; 
     } 
     return Binding.DoNothing; 
    } 
}