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;
            }
        }

    }
相关推荐
大霸王龙5 小时前
系统模块与功能设计框架
人工智能·wpf
明耀20 小时前
WPF DataGrid 默认显示行号
wpf
lph19721 天前
wpf的converter
wpf
fyifei05581 天前
WPF学习PropertyChanged
wpf
爱炸薯条的小朋友1 天前
C#由于获取WPF窗口名称造成的异常报错问题
windows·c#·wpf
baivfhpwxf20231 天前
wpf ListBox 去除item 单击样式
wpf
诗仙&李白1 天前
lnnovationHubTool,用prism+WPF编写的MVVM模式的快速上位机软件开发框架平台
wpf·mvvm·prism·上位机软件开发框架平台
程序员小刘1 天前
【HarmonyOS 5】教育开发实践详解以及详细代码案例
华为·wpf·harmonyos
Java Fans2 天前
在WPF项目中集成Python:Python.NET深度实战指南
python·.net·wpf
布伦鸽2 天前
C# WPF 左右布局实现学习笔记(1)
笔记·学习·c#·wpf