Синхронизировать выбор Radiobutton с выбором строки в сетке данных

У меня есть RadioButtonTemplateColumn в моей сетке данных. Когда нажимается радиокнопка, выбирается соответствующая строка, но когда нажимается строка, соответствующая радиокнопка не выбирается. Это оставляет систему в «запутанном» состоянии, поскольку радиокнопка и выбор строки не синхронизированы. Пожалуйста, как мне их синхронизировать? Я просмотрел аналогичный ответ, но он не решил проблему или меня.

Ниже приведен код, который я написал:

            <DataGrid.Columns>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <RadioButton GroupName="Select" IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTextColumn Width="Auto" Header="First Name" Binding="{Binding FirstName}"/>
                <DataGridTextColumn Width="Auto" Header="Last Name" Binding="{Binding LastName}"/>
            </DataGrid.Columns>
        </DataGrid>

person Murphy Ochuba    schedule 06.02.2020    source источник


Ответы (1)


Проблема в том, что ваша привязка недействительна. Если вы используете такой инструмент, как Snoop Wpf, или живое визуальное дерево в Visual Studio, вы увидите, что ваша привязка не работает.

Причина в том, что ваш RadioButton находится внутри шаблона, который имеет контекст данных данных, к которым привязана сетка, а не DataGridRow. Если вы обновите свою привязку таким образом, она будет работать:

IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Path=IsSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 

По сути, я сказал привязке искать IsSelected относительно DataGridRow выше в визуальном дереве.

Другая проблема заключается в том, что, поскольку вы используете RadioButton, его нельзя отменить при нажатии на него. Если вы хотите, чтобы он действовал как переключатель, вместо него следует использовать CheckBox.

Надеюсь, это поможет.

person Keithernet    schedule 06.02.2020