【问题标题】:Radio Button grouping in the multi column list view多列列表视图中的单选按钮分组
【发布时间】:2019-10-15 04:36:03
【问题描述】:

我有一个包含 3 个以下列的列表视图: 1.一个文本列 2.单选按钮 3.单选按钮

我正在尝试将两个单选按钮分组,但所有单选按钮都归为一组。 例如如果有两个 listview 项(两行),则所有 4 个单选按钮都归为一个。

<ListView Name="ruleListView"  ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                    ScrollViewer.VerticalScrollBarVisibility="Auto" 
 Margin="10">
                <ListView.View>
                    <GridView>
                        <GridView.ColumnHeaderContainerStyle>
                            <Style TargetType="{x:Type GridViewColumnHeader}">
                                <Setter Property="IsEnabled" Value="False"/>
                            </Style>
                        </GridView.ColumnHeaderContainerStyle>
                        <GridViewColumn 
                                Header="Rule"

                                >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock 
                                        HorizontalAlignment="Right"
                                        Width="410"
                                        TextWrapping="Wrap" Text="{Binding Rule}" TextAlignment="Left"
                                        />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn 
                                Header="Configuration Key"
                            Width="140"

                                >

                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                        <RadioButton GroupName="Rule"
                                                     VerticalAlignment="Center" 
                                                     HorizontalAlignment="Center" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn 
                                Header="Event"
                                Width="100"
                                >
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                        <RadioButton GroupName="Rule"
                                                 VerticalAlignment="Center" 
                                                 HorizontalAlignment="Center" 
                                                 IsChecked="True"
                                                 />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>

我希望应该根据特定行进行分组。

【问题讨论】:

  • 使用相同的 GroupName 会强制将所有单选按钮链接在一起。根据您在列表中绑定的对象,您可以使用数据绑定完成您想要的。
  • 两个单选按钮独立于项目源绑定到列表。你能解释一下你的建议吗?
  • 我可以解释更多,但我需要知道您是使用 MVVM 并将对象绑定到 ItemSource,还是直​​接在 UI 中手动设置项目?如果您将对象绑定到 ItemSource,您是否绑定了可以修改源代码的自定义对象?
  • 到目前为止,我没有使用 MVVM 作为项目源。
  • 您的问题解决了吗?

标签: c# wpf listview radio-button


【解决方案1】:

据我了解,RadioButton.GroupName 适用于所有活动控件。这就是为什么您会看到所有单选按钮链接在一起。为了使每一行都被链接,您需要为每一行设置一个唯一的 GroupName。在 MVVM 中,您可以将 GroupName 绑定到底层项目的属性,或者将 RadioButton 的 IsChecked 属性绑定到 ViewModel 并管理代码中的切换。

由于您不使用 ViewModels,所以它有点复杂。您仍然需要为每行创建一个唯一的 GroupName。我能想到的最简单的方法是使用 IValueConverter 来获取行索引。

public class RadioGroupIndexConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is ListViewItem lvi)
        {
            var listView = ItemsControl.ItemsControlFromItemContainer(lvi);
            var index = listView.ItemContainerGenerator.IndexFromContainer(lvi);
            return string.Format("{0}{1}", parameter, index);
        }
        return parameter;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后您需要使用转换器将 GroupName 绑定到 ListViewItem。

首先,您需要将转换器添加为 xaml 中的资源。其中

<ListView.Resources>
    <converters:RadioGroupIndexConverter x:Key="GroupConverter"/>
</ListView.Resources>

然后您将更改 RadioButton.GroupName 以使用相对绑定。

<RadioButton GroupName="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Converter={StaticResource GroupConverter}}"/>

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 2014-06-19
    • 2012-07-31
    • 2018-09-19
    • 2021-04-09
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多