gpt4 book ai didi

wpf - 将 RadioButton IsChecked 绑定(bind)到 ListBoxItem IsSelected 和 ListBox IsFocused

转载 作者:行者123 更新时间:2023-12-04 03:19:53 26 4
gpt4 key购买 nike

我见过其他与此非常相似的问题,但不知何故我仍然无法让它工作。这是场景。

我有什么我有一个显示我的 View 模型列表的 ListBox。每个 View 模型都有一个显示在另一个嵌套列表框中的子项列表。我正在使用 DataTemplate 来实现这一点。

我想要什么我希望子项目有一个 RadioButton,当 ListBoxItem 被选中并且 ListBox 有焦点时(内部 列表框)。

目前,上面的 IsSelected 部分运行良好,但是当我从一个 View 模型移动到另一个 View 模型时(即第一个 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 效果很好,即列表中只有一个项目在任何时候都选择了单选按钮。但是,当控件失去焦点时,所选项目的单选按钮仍处于选中状态(不是我想要的)。

最佳答案

这是最终运行的 xaml。禁用单选按钮似乎是这里的关键。

<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<RadioButton x:Name="rbIsSelected" IsChecked="False" IsEnabled="False" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="3" />
<ContentPresenter Grid.Column="1"/>
</Grid>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True"/>
<Condition Property="Selector.IsSelectionActive" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="IsChecked" TargetName="rbIsSelected" Value="True"/>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>

查看默认模板很有帮助。

关于wpf - 将 RadioButton IsChecked 绑定(bind)到 ListBoxItem IsSelected 和 ListBox IsFocused,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1349039/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com