Насколько я понимаю, 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}}"/>