C# 如何将标签的可见性属性绑定到多个单选按钮?
标签的可见性属性可以使用BooltVisiblityConverter连接到RadioButton的IsChecked属性。但如何将一个标签的可见性连接到多个已检查属性 例如,当选中单选按钮1、3或5时,C# 如何将标签的可见性属性绑定到多个单选按钮?,c#,.net,wpf,xaml,data-binding,C#,.net,Wpf,Xaml,Data Binding,标签的可见性属性可以使用BooltVisiblityConverter连接到RadioButton的IsChecked属性。但如何将一个标签的可见性连接到多个已检查属性 例如,当选中单选按钮1、3或5时,应可见,当选中单选按钮2或4时,应可见 <Grid> <Grid.RowDefinitions> <RowDefinition></RowDefinition> <RowDefinition>&l
应可见,当选中单选按钮2或4时,
应可见
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<StackPanel>
<RadioButton Content="1"></RadioButton>
<RadioButton Content="2"></RadioButton>
<RadioButton Content="3"></RadioButton>
<RadioButton Content="4"></RadioButton>
<RadioButton Content="5"></RadioButton>
</StackPanel>
<StackPanel Grid.Row="1">
<Label Content="1"></Label>
<Label Content="2"></Label>
</StackPanel>
</Grid>
当选中
单选按钮
s1,3,5中的一个标签时,如果希望标签可见,可以尝试这种方法。
定义多重绑定和转换器。
转换器:
public class LabelVisibilityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null) return false;
return values.Any(v =>
{
bool? b = v as bool?;
return b.HasValue && b.Value;
});
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
这是一个例子。在Convert方法中,我们检查是否有任何from values参数为bool且值为true。以下是如何在标记中使用转换器:
<Grid>
<Grid.Resources>
<conv:LabelVisibilityConverter x:Key="LabelConverter"/>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<StackPanel>
<RadioButton x:Name="1" Content="1"></RadioButton>
<RadioButton x:Name="2" Content="2"></RadioButton>
<RadioButton x:Name="3" Content="3"></RadioButton>
<RadioButton x:Name="4" Content="4"></RadioButton>
<RadioButton x:Name="5" Content="5"></RadioButton>
</StackPanel>
<StackPanel Grid.Row="1">
<Label Content="1">
<Label.Visibility>
<MultiBinding Converter="{StaticResource LabelConverter}">
<Binding Path="IsChecked" ElementName="1"/>
<Binding Path="IsChecked" ElementName="3"/>
<Binding Path="IsChecked" ElementName="5"/>
</MultiBinding>
</Label.Visibility>
</Label>
<Label Content="2">
<Label.Visibility>
<MultiBinding Converter="{StaticResource LabelConverter}">
<Binding Path="IsChecked" ElementName="2"/>
<Binding Path="IsChecked" ElementName="4"/>
</MultiBinding>
</Label.Visibility>
</Label>
</StackPanel>
</Grid>
您可以使用MultiDataTrigger完全在Xaml中设置值,而无需使用转换器:
<StackPanel>
<RadioButton x:Name="RadioButton1" Content="1" />
<RadioButton x:Name="RadioButton2" Content="2" />
<RadioButton x:Name="RadioButton3" Content="3" />
<RadioButton x:Name="RadioButton4" Content="4" />
<RadioButton x:Name="RadioButton5" Content="5" />
</StackPanel>
<StackPanel Grid.Row="1">
<Label x:Name="FirstLabel" Content="1">
<Label.Style>
<Style>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=RadioButton1, Path=IsChecked}" Value="True" />
<Condition Binding="{Binding ElementName=RadioButton3, Path=IsChecked}" Value="True" />
<Condition Binding="{Binding ElementName=RadioButton5, Path=IsChecked}" Value="True" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter TargetName="FirstLabel" Property="Visibility" Value="Visible" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
</StackPanel>
帮助回答:您是使用MVVM方法(意味着您有一个视图模型控制UI)还是依赖代码隐藏?如果使用代码隐藏,将不会有任何附加值。当然,@GauravKP one的可能副本应该有一个视图模型。但这个问题并不是解释MVVM方法的最佳地方。虽然这完全可以用XAML解决,正如链接问题的答案所示。@spontifix您发布的链接应该可以解决这个问题。格雷蒂特的好建议。但实施条件与关系。在我的例子中,我需要implemet或Relation。然后只为每个条件添加一个简单的DataTrigger。哇,这是一个非常聪明的解决方案!
<StackPanel>
<RadioButton x:Name="RadioButton1" Content="1" />
<RadioButton x:Name="RadioButton2" Content="2" />
<RadioButton x:Name="RadioButton3" Content="3" />
<RadioButton x:Name="RadioButton4" Content="4" />
<RadioButton x:Name="RadioButton5" Content="5" />
</StackPanel>
<StackPanel Grid.Row="1">
<Label x:Name="FirstLabel" Content="1">
<Label.Style>
<Style>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=RadioButton1, Path=IsChecked}" Value="True" />
<Condition Binding="{Binding ElementName=RadioButton3, Path=IsChecked}" Value="True" />
<Condition Binding="{Binding ElementName=RadioButton5, Path=IsChecked}" Value="True" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter TargetName="FirstLabel" Property="Visibility" Value="Visible" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
</StackPanel>