ListBox分组的实现

想实现以下效果:

一开始用的是 <ListBox.GroupStyle>,点击也可以触发Checked的事件。但有个问题是,无法设置RadioButton的选中。 通过VisualTreeHelper也能找到RadioButton,但是设置IsChecked = true,不显示选中。

XML 复制代码
        <!--  avi列表  -->
        <ListBox  ItemsSource="{Binding Source={StaticResource MiceVideosSource}}" HorizontalAlignment="left"   Background="Transparent" BorderThickness="0" Margin="30,0,0,0" SelectedIndex="0">
            <ListBox.GroupStyle>
                <GroupStyle>
                    <GroupStyle.HeaderTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <RadioButton Grid.Column="0" GroupName="MiceVideos"  Checked="MiceVideosRadioButton_OnChecked" Tag="{Binding Name}">
                                    <RadioButton.RenderTransform>
                                        <ScaleTransform ScaleX="1.5" ScaleY="1.5"/>
                                    </RadioButton.RenderTransform>
                                </RadioButton>
                                <TextBlock Text="{Binding Name}"  Style="{StaticResource HeadTitle2}" Margin="10,0,0,0"/>
                            </StackPanel>
                        </DataTemplate>
                    </GroupStyle.HeaderTemplate>
                </GroupStyle>
            </ListBox.GroupStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}"  Style="{StaticResource TextBlockNormalStyle}" ToolTip="{Binding FullName}" Margin="20,0,0,0" ></TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
</GroupBox>

确定无法解决后,换了一种实现方式。采用ListBox套ListBox,代码如下:

XML 复制代码
                    <!--  avi列表  -->
                <ListBox  ItemsSource="{Binding MiceVideos}" HorizontalAlignment="left"   Background="Transparent" BorderThickness="0" Margin="30,0,0,0" x:Name="MiceVideosListBox"  >
                        <ListBox.ItemContainerStyle>
                            <Style TargetType="ListBoxItem">
                                <Setter Property="HorizontalAlignment" Value="Left" />
                                <Setter Property="HorizontalContentAlignment" Value="Left" />
                            </Style>
                        </ListBox.ItemContainerStyle>
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition ></RowDefinition>
                                        <RowDefinition ></RowDefinition>
                                    </Grid.RowDefinitions>
                                <StackPanel Orientation="Horizontal" Grid.Row="0">
                                    <RadioButton  GroupName="MiceVideos"  Checked="MiceVideosRadioButton_OnChecked" Tag="{Binding GroupName}" x:Name="MiceGroupRadioButton" IsChecked="{Binding IsChecked }" >
                                        <RadioButton.RenderTransform>
                                            <ScaleTransform ScaleX="1.5" ScaleY="1.5"/>
                                        </RadioButton.RenderTransform>
                                    </RadioButton>
                                    <TextBlock Text="{Binding GroupName}"  Style="{StaticResource TextBlockNormalStyle}" Margin="10,0,0,0"/>
                                </StackPanel>
                                    <ListBox Grid.Row="1" ItemsSource="{Binding ChannelOptionList }" BorderThickness="0">
                                        <ListBox.ItemContainerStyle>
                                            <Style TargetType="ListBoxItem">
                                                <Setter Property="HorizontalAlignment" Value="Left" />
                                                <Setter Property="HorizontalContentAlignment" Value="Left" />
                                            </Style>
                                        </ListBox.ItemContainerStyle>
                                    <ListBox.ItemTemplate>
                                            <DataTemplate>
                                                <StackPanel Orientation="Horizontal">
                                                <TextBlock Text="{Binding Name}"  Style="{StaticResource TextBlockNormalStyle}" ToolTip="{Binding FullName}" Margin="20,0,0,0" ></TextBlock>

                                                <Button Width="40"  Command="{Binding   DataContext.OpenCsvFileCommand, ElementName=MiceVideosListBox}" 
                                 CommandParameter="{Binding}"
        attach:BorderElement.CornerRadius="6,6,6,6"
                                 Style="{StaticResource ButtonIcon}"
                                            attach:IconElement.Geometry="{StaticResource OpenFolderGeometry1}" Margin="10,0,0,0" />

                                    <TextBlock Text="{Binding CsvName}"  Style="{StaticResource TextBlockNormalStyle}" ToolTip="{Binding CsvName}" Margin="10,0,0,0" ></TextBlock>

                                    <Button 
                                            VerticalAlignment="Center"
                                            Command="{Binding DataContext.FileDeleteCommand, ElementName=MiceVideosListBox}" 
                                            CommandParameter="{Binding}"
                                            Style="{StaticResource ButtonIcon}"
                                            attach:IconElement.Geometry="{StaticResource DeleteGeometry}" Margin="10,0,0,0" Visibility="{Binding DeleteButtonVisibility}"/>
                                                </StackPanel>
                                        </DataTemplate>
                                        </ListBox.ItemTemplate>
                                    </ListBox>
                            </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

RadioButtonGroup类,GroupName和IsChecked用于绑定最外层的ListBox,用于分组显示。ChannelOptionList用于绑定里面的ListBox,用于显示列表。RadioButton的IsChecked="{Binding IsChecked }" ,就可以设置是否选中了。

cs 复制代码
    public class RadioButtonGroup
    {
        private string _groupName;
        /// <summary>
        /// 分组名称
        /// </summary>
        public string GroupName
        {
            get => _groupName;
            set
            {
                _groupName = value;
            }
        }

        private bool _isChecked;
        /// <summary>
        /// 分组名称
        /// </summary>
        public bool IsChecked
        {
            get => _isChecked;
            set
            {
                _isChecked = value;
            }
        }

        /// <summary>
        /// CellVideo的列表
        /// </summary>
        private ObservableCollection<ChannelOption> _channelOptionList = new();

        public ObservableCollection<ChannelOption> ChannelOptionList
        {
            get => _channelOptionList;
            set
            {
                _channelOptionList = value;
            }
        }

    }
相关推荐
无心水9 小时前
分布式定时任务与SELECT FOR UPDATE:从致命陷阱到优雅解决方案(实战案例+架构演进)
服务器·人工智能·分布式·后端·spring·架构·wpf
LZL_SQ11 小时前
HCCL测试框架中AllReduce边界条件测试设计深度剖析
wpf·cann
User_芊芊君子1 天前
【分布式训练】CANN SHMEM跨设备内存通信库:构建高效多机多卡训练的关键组件
分布式·深度学习·神经网络·wpf
就是有点傻2 天前
WPF按钮走马灯效果
wpf
zuozewei2 天前
虚拟电厂聚合商平台安全技术体系深度解读
安全·wpf
极客智造2 天前
WPF 自定义控件:AutoGrid 实现灵活自动布局的网格控件
wpf
极客智造2 天前
WPF Grid 布局高效扩展:GridHelpers 附加属性工具类全解析
wpf
张人玉2 天前
WPF 多语言实现完整笔记(.NET 4.7.2)
笔记·.net·wpf·多语言实现·多语言适配
暖馒2 天前
深度剖析串口通讯(232/485)
开发语言·c#·wpf·智能硬件
我要打打代码3 天前
WPF控件(2)
wpf