Leucomelas
Leucomelas

Reputation: 25

wpfdatagrid radiobutton select and unselect problems

I got a datagrid with few column per row with radiobutton. Actually, I got 2 problems:

  1. I can select multiple radiobutton per row. That's not good, I must select only one.
  2. I can't unselect when a radiobutton's selected.

I've only the XAML code:

<DataGrid AutoGenerateColumns="False" VerticalAlignment="Stretch"  Grid.Row="1" Name="dg1" ItemsSource="{Binding Source={StaticResource XmlData},XPath=Limits/*}">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Capacité" CellTemplate="{StaticResource CustomCapacityTemplate}" />
                <DataGridTemplateColumn Header="Aucune" Width="60">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <RadioButton GroupName="{Binding XPath=ID}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Légère" Width="60">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <RadioButton GroupName="{Binding XPath=ID}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Modérée" Width="60">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <RadioButton GroupName="{Binding XPath=ID}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Forte" Width="60">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <RadioButton GroupName="{Binding XPath=ID}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Totale" Width="60">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <RadioButton GroupName="{Binding XPath=ID}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>

            <DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding XPath=explicationTitle}" FontWeight="Bold" Margin="10" />
                        <TextBlock Text="{Binding XPath=explicationDescription}" Margin="10" />
                        <TextBlock Text="Aucune" FontWeight="Bold" Margin="10" />
                        <TextBlock Text="{Binding XPath=explicationLimiteAucune}" Margin="10" />
                        <TextBlock Text="Modérée" FontWeight="Bold" Margin="10" />
                        <TextBlock Text="{Binding XPath=explicationLimiteModeree}" Margin="10" />
                        <TextBlock Text="Totale" FontWeight="Bold" Margin="10" />
                        <TextBlock Text="{Binding XPath=explicationLimiteTotale}" Margin="10" />
                    </StackPanel>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
        </DataGrid>

Upvotes: 1

Views: 462

Answers (1)

daniel
daniel

Reputation: 1070

Assume the property is string CurrentOption

Add this

<UserControl.Resources>
    <self:CurrentOptionConverter x:Key="CurrentOptionConverter" />
</UserControl.Resources>

Change as this, for problem 1, solve this by ID should be string.

<DataGrid AutoGenerateColumns="False" VerticalAlignment="Stretch"  Grid.Row="1" Name="dg1" ItemsSource="{Binding Source={StaticResource XmlData},XPath=Limits/*}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Capacite" CellTemplate="{StaticResource CustomCapacityTemplate}" />
        <DataGridTemplateColumn Header="Clear" Width="60">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <RadioButton GroupName="{Binding XPath=ID}" 
                        IsChecked={Binding XPath=CurrentOption, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
                        Converter={StaticResource CurrentOptionConverter}, ConverterParameter={x:Null}}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Aucune" Width="60">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <RadioButton GroupName="{Binding XPath=ID}" 
                        IsChecked={Binding XPath=CurrentOption, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
                        Converter={StaticResource CurrentOptionConverter}, ConverterParameter=Aucune}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Legere" Width="60">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <RadioButton GroupName="{Binding XPath=ID}" 
                        IsChecked={Binding XPath=CurrentOption, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
                        Converter={StaticResource CurrentOptionConverter}, ConverterParameter=Legere}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Moderee" Width="60">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <RadioButton GroupName="{Binding XPath=ID}" 
                        IsChecked={Binding XPath=CurrentOption, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
                        Converter={StaticResource CurrentOptionConverter}, ConverterParameter=Moderee}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Forte" Width="60">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <RadioButton GroupName="{Binding XPath=ID}" 
                        IsChecked={Binding XPath=CurrentOption, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
                        Converter={StaticResource CurrentOptionConverter}, ConverterParameter=Forte}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Totale" Width="60">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <RadioButton GroupName="{Binding XPath=ID}" 
                        IsChecked={Binding XPath=CurrentOption, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,
                        Converter={StaticResource CurrentOptionConverter}, ConverterParameter=Totale}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>

CurrentOptionConverter.cs

public class CurrentOptionConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null && parameter != null)
        {
            return value.Equals(parameter);
        }
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((bool)value)
        {
            return parameter;
        }
        return Binding.DoNothing;
    }
}

Upvotes: 1

Related Questions