Я видел другие вопросы, очень похожие на это, но почему-то я все еще не могу заставить их работать. Вот сценарий.
Что у меня
У меня есть 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
, но это тоже не сработало. Есть предложения?
UPDATE
Обновление, чтобы включить мою попытку на 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
прекрасно работает, то есть только один элемент в списке имеет выбранную радиокнопку в любой момент. Однако, когда элемент управления теряет фокус, радиокнопка выбранного элемента все еще выбрана (не то, что я хочу).