将 3 个可见性绑定到一个
Binding 3 visibility to one
我正在研究 WPF mvvm project.I 设计了一个包含 3 个标签的堆栈面板。每个标签都有其可见性。我想在隐藏所有 3 个标签时将面板的可见性设置为隐藏。
<StackPanel Visibility="{Binding cond1 || cond2 || cond3}" >
<Label Visibility="{Binding cond1}" Content="1"/>
<Label Visibility="{Binding cond2}" Content="2"/>
<Label Visibility="{Binding cond3}" Content="3"/>
</StackPanel>
我该怎么做。
谢谢
其中一个选项是使用 MultiValueConverters:
http://www.codeproject.com/Articles/328978/Introduction-to-multi-binding-and-multi-value-conv
另一种选择是在您的视图模型中公开 MergedCondition:
public bool MergedCondition
{
get
{
return cond1 || cond2 || cond3;
}
}
如果任何条件发生变化,您还需要提出 MergedCondition
已发生变化:
public bool cond1 {
get {
return _cond1;
}
set {
_cond1 = value;
RaisePropertyChanged();
RaisePropertyChanged("MergedCondition");
}
@Chris Eelmaa 的解决方案已经足够好了。
如果您不想更改您的视图模型,您可以在子标签的可见性上使用 MultiDataTrigger。
<Style TargetType="StackPanel">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=Label1, Path=Visibility}" Value="Hidden" />
<Condition Binding="{Binding ElementName=Label2, Path=Visibility}" Value="Hidden" />
<Condition Binding="{Binding ElementName=Label3, Path=Visibility}" Value="Hidden" />
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Hidden" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
另一种方法是使用 quick converters
添加命名空间后:
xmlns:qc="clr-namespace:QuickConverter;assembly=QuickConverter"
并在 App.Xaml.cs 中设置快速转换器:
public App()
: base()
{
// Setup Quick Converter.
QuickConverter.EquationTokenizer.AddNamespace(typeof(object));
QuickConverter.EquationTokenizer.AddNamespace(typeof(System.Windows.Visibility));
}
像这样使用它:
<StackPanel Visibility="{qc:MultiBinding '($P1 == Visibility.Visible || $P2 == Visibility.Visible || $P3 == Visibility.Visible)?Visibility.Visible:Visibility.Collapsed ', P1={Binding Path=Val1},P2={Binding Path=Val2},P3={Binding Path=Val3}}" >
<Label Visibility="{Binding Val1}" Content="1"/>
<Label Visibility="{Binding Val2}" Content="2"/>
<Label Visibility="{Binding Val3}" Content="3"/>
</StackPanel>
我正在研究 WPF mvvm project.I 设计了一个包含 3 个标签的堆栈面板。每个标签都有其可见性。我想在隐藏所有 3 个标签时将面板的可见性设置为隐藏。
<StackPanel Visibility="{Binding cond1 || cond2 || cond3}" >
<Label Visibility="{Binding cond1}" Content="1"/>
<Label Visibility="{Binding cond2}" Content="2"/>
<Label Visibility="{Binding cond3}" Content="3"/>
</StackPanel>
我该怎么做。 谢谢
其中一个选项是使用 MultiValueConverters:
http://www.codeproject.com/Articles/328978/Introduction-to-multi-binding-and-multi-value-conv
另一种选择是在您的视图模型中公开 MergedCondition:
public bool MergedCondition
{
get
{
return cond1 || cond2 || cond3;
}
}
如果任何条件发生变化,您还需要提出 MergedCondition
已发生变化:
public bool cond1 {
get {
return _cond1;
}
set {
_cond1 = value;
RaisePropertyChanged();
RaisePropertyChanged("MergedCondition");
}
@Chris Eelmaa 的解决方案已经足够好了。
如果您不想更改您的视图模型,您可以在子标签的可见性上使用 MultiDataTrigger。
<Style TargetType="StackPanel">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=Label1, Path=Visibility}" Value="Hidden" />
<Condition Binding="{Binding ElementName=Label2, Path=Visibility}" Value="Hidden" />
<Condition Binding="{Binding ElementName=Label3, Path=Visibility}" Value="Hidden" />
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Hidden" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
另一种方法是使用 quick converters 添加命名空间后:
xmlns:qc="clr-namespace:QuickConverter;assembly=QuickConverter"
并在 App.Xaml.cs 中设置快速转换器:
public App()
: base()
{
// Setup Quick Converter.
QuickConverter.EquationTokenizer.AddNamespace(typeof(object));
QuickConverter.EquationTokenizer.AddNamespace(typeof(System.Windows.Visibility));
}
像这样使用它:
<StackPanel Visibility="{qc:MultiBinding '($P1 == Visibility.Visible || $P2 == Visibility.Visible || $P3 == Visibility.Visible)?Visibility.Visible:Visibility.Collapsed ', P1={Binding Path=Val1},P2={Binding Path=Val2},P3={Binding Path=Val3}}" >
<Label Visibility="{Binding Val1}" Content="1"/>
<Label Visibility="{Binding Val2}" Content="2"/>
<Label Visibility="{Binding Val3}" Content="3"/>
</StackPanel>