Группировка переключателей в виде списка из нескольких столбцов - PullRequest
0 голосов
/ 29 мая 2019

У меня есть представление списка с 3 следующими столбцами: 1. Текстовый столбец 2. Переключатель 3. Переключатель

Я пытаюсь сгруппировать два переключателя, но все переключатели попадают в одну группу,например, если есть два элемента списка (две строки), тогда все 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>

Я ожидаю, что группировка должна выполняться в соответствии с конкретной строкой.

1 Ответ

0 голосов
/ 31 мая 2019

Насколько я понимаю, RadioButton.GroupName применяется ко всем активным элементам управления. Вот почему вы видите все переключатели, связанные вместе. Чтобы связать каждую строку, вам нужно уникальное имя группы для каждой строки. В MVVM вы можете привязать GroupName к свойству базового элемента или привязать свойство IsChecked RadioButton к 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();
    }
}

Затем вам нужно привязать имя группы к ListViewItem с помощью конвертера.

Сначала вам нужно добавить конвертер в качестве ресурсов в xaml. Где <преобразователи: ссылка на пространство имен класса RadioGroupIndexConverter. Если вы создали класс в том же пространстве имен, что и ваш ListView, вы можете просто использовать <local: </p>

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

Затем вы измените свое RadioButton.GroupName для использования относительной привязки.

<RadioButton GroupName="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Converter={StaticResource GroupConverter}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...