WPF 条件绑定(仅在...时绑定)

问题描述 投票:0回答:1

我有一个视图模型,其中包含具有

Checked
属性的项目列表。
在我的 WPF XAML 中,我创建了一个
ListBox
,其项目的
DataTemplate
中每个项目都有一个复选框。

此外,视图模型还有一个属性

AllowMultiSelect
。如果为 true,则界面必须允许用户选中许多复选框。但如果为 false,则界面应显示
RadioButton
,并且用户应仅选择一个。

我尝试了一个奇特的 XAML,其中包含项目的

CheckBox
RadioButton
,并在一些派生属性的帮助下根据
Visibility
的值设置它们的
AllowMultiSelect

<ListBox.ItemTemplate>
    <DataTemplate DataType="{x:Type local:VMType}">
        <StackPanel Orientation="Horizontal" Margin="0 5 0 0">
            <CheckBox IsChecked="{Binding IsChecked}" 
                      Visibility="{Binding Path=DataContext.ShowCheck, 
                                           ElementName=MyList,
                                           Converter={StaticResource BoolToVisible}}"/>
            <RadioButton IsChecked="{Binding IsChecked}" GroupName="TableRadios"
                         Visibility="{Binding Path=DataContext.ShowRadio,
                                              ElementName=MyList, 
                                              Converter={StaticResource BoolToVisible}}"/>
            <TextBlock Text="{Binding Text}" Margin="5 0 0 0"/>
        </StackPanel>

但是

RadioButton
(甚至隐藏)正在影响选择。当我单击复选框时,该项目的
Checked
属性会发生变化,此更改会反映在隐藏的
RadioButton
中,然后收音机会自动取消选择其他项目。

问题:有没有办法“仅当”属性为真时才进行绑定?如果

AllowMultiSelect
为 true,我不想绑定单选按钮。

c# wpf binding
1个回答
0
投票

这不是你问的,但我认为完全切换 CheckBox 和 RadioButton 会简单得多。

<DataTemplate>
    <StackPanel Orientation="Horizontal" Margin="0 5 0 0">
        <ContentControl>
            <ContentControl.Style>
                <Style TargetType="ContentControl">
                    <Setter Property="Content">
                        <Setter.Value>
                            <CheckBox IsChecked="{Binding IsChecked}"/>
                        </Setter.Value>
                    </Setter>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=DataContext.ShowRadio, ElementName=MyList}" Value="True">
                            <Setter Property="Content">
                                <Setter.Value>
                                    <RadioButton IsChecked="{Binding IsChecked}" GroupName="TableRadios"/>
                                </Setter.Value>
                            </Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ContentControl.Style>
        </ContentControl>
        <TextBlock Text="{Binding Text}" Margin="5 0 0 0"/>
    </StackPanel>
</DataTemplate>
© www.soinside.com 2019 - 2024. All rights reserved.