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

    }
相关推荐
码界奇点3 小时前
基于eBPF技术的高性能网络防火墙系统设计与实现
开发语言·网络·毕业设计·php·wpf·go语言·源代码管理
cjp5607 小时前
022.WPF 封装TextBox控件限制只输入数字自定义属性
wpf
cjp5607 小时前
021.WPF 以MVVM模式控制combox控件显示/隐藏
wpf
小北方城市网18 小时前
Redis 分布式锁高可用实现:从原理到生产级落地
java·前端·javascript·spring boot·redis·分布式·wpf
流水线上的指令侠1 天前
补充说明——针对《C#:从 0 到 1 创建基于 NUnit + FlaUI 的 WPF UI 自动化测试项目》
功能测试·ui·c#·自动化·wpf
流水线上的指令侠1 天前
C# 实战:从 0 到 1 搭建基于 NUnit + FlaUI 的 WPF UI 自动化测试项目
功能测试·ui·c#·自动化·wpf·visual studio
贾修行1 天前
.NET 全栈开发学习路线:从入门到分布式
c#·.net·wpf·asp.net core·web api·winforms·services
晓13131 天前
第四章:Redis实战应用及常见问题(下篇)
java·数据库·缓存·wpf
掘根2 天前
【jsonRpc项目】客户端的Requestor模块,RpcCaller模块
wpf
FuckPatience2 天前
WPF ListBoxItem绑定自己在ListBox中的顺序
wpf