【问题标题】:wpf - on select item from nested listview also select parent listviewwpf - 在从嵌套列表视图中选择项目时也选择父列表视图
【发布时间】:2017-01-23 06:49:55
【问题描述】:

我有一个包含一个文本块和另一个列表的列表视图。 我希望当用户单击嵌套的 listviewitem 时,父 listviewitem 也会被选中。 例子:

在上图中,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>

【问题讨论】:

  • 你能描述一些关于所需选择行为的更多细节吗?从你的图片看起来好像Lista1.Linia6最后被选中了,但是你写的它也应该选择Lista2,所以我不太明白你想要什么。
  • 对帖子进行了编辑并添加了以下信息:在上图中选择了 Lista2(父列表项)。用户单击 Lista1 中的 Linia6 以将其选中。当 Lista1(嵌套列表项)中的 Linia6 被选中时,Lista1(父列表项)也会被选中。
  • 是否应该取消选择Lista2.Linia4(基本上,在所有嵌套列表中只有一个选择)?
  • 没有考虑这部分,虽然这对我来说是一个很好的做法并且很有趣,但我知道如何做到这一点
  • 好吧,你应该考虑使用 TreeViewHierarchicalDataTemplate 而不是嵌套的 ListView

标签: wpf


【解决方案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;
    }
}

【讨论】:

    猜你喜欢
    • 2012-04-04
    • 2012-12-15
    • 2016-10-26
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多