Я видел другие вопросы, очень похожие на этот, но почему-то все еще не могу заставить его работать. Вот сценарий.
Что у меня есть. У меня есть ListBox
, который отображает список моих моделей представления. Каждая модель представления имеет список дочерних элементов, которые отображаются в другом вложенном списке. Для этого я использую DataTemplate
.
Чего я хочу Я хочу, чтобы у дочерних элементов был RadioButton
, который выбирается, когда выбран ListBoxItem
и когда ListBox
находится в фокусе (внутренний ListBox
).
В настоящее время часть IsSelected
из вышеперечисленного отлично работает, однако, когда я перехожу от одной модели представления к другой (т.е. первый ListBox теряет фокус), переключатель на первом ListBox
остается выбранным.
Вот код:
<Style TargetType="{x:Type ListBox}">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type ListBoxItem}" >
<Setter Property="Margin" Value="2" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<RadioButton Focusable="False">
<RadioButton.Style>
<Style TargetType="{x:Type RadioButton}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsFocused, Mode=OneWay, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}}" Value="False">
<Setter Property="IsChecked" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</RadioButton.Style>
<RadioButton.IsChecked>
<Binding Path="IsSelected" Mode="TwoWay" RelativeSource="{RelativeSource TemplatedParent}" />
</RadioButton.IsChecked>
<ContentPresenter></ContentPresenter>
</RadioButton>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>
Я тоже пробовал MultiBinding
, но это тоже не помогло. Какие-либо предложения?
ОБНОВЛЕНИЕ Обновите, чтобы включить мою попытку MultiBinding
:
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<RadioButton>
<RadioButton.IsChecked>
<MultiBinding>
<MultiBinding.Converter>
<DataExportTool:AllTrueConverter/>
</MultiBinding.Converter>
<Binding Path="IsSelected" Mode="TwoWay" RelativeSource="{RelativeSource TemplatedParent}"/>
<Binding Path="IsFocused" Mode="OneWay" RelativeSource="{RelativeSource TemplatedParent}"/>
</MultiBinding>
</RadioButton.IsChecked>
<ContentPresenter/>
</RadioButton>
</ControlTemplate>
И конвертер:
public class AllTrueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.Cast<bool>().All(x => x);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return Enumerable.Repeat((bool)value, 2).Cast<object>().ToArray();
}
}
Часть IsSelected
отлично работает, т.е. только один элемент в списке имеет радиокнопку, выбранную в любой момент. Однако, когда элемент управления теряет фокус, переключатель выбранного элемента по-прежнему остается выбранным (не то, что я хочу).