我在加载一系列仪表用户控件的用户控件中具有以下 XAML:
<ItemsControl ItemsSource="{Binding InstanceViper.Gauges}" Grid.Row="7" Grid.ColumnSpan="4">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Name="GaugePanel" VerticalAlignment="Bottom" HorizontalAlignment="Left" Orientation="Horizontal">
</WrapPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:Gauge DataContext="{Binding}" AlwaysShowGauge="False"></local:Gauge>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我正在传递一个标志,该标志确定仪表是应始终显示还是仅在警报时显示。现在在仪表 xaml 中,我想执行以下操作来确定是否应该显示它:
<Border Name="MainBorder" Visibility="{Binding (ShowAlarm || AlwaysShowGauge) ,Converter={StaticResource BooleanToVisibilityConverter}}">
问题是 ShowAlarm 属性来自仪表视图模型,而 AlwaysShowGauge 是在数据模板中传入的本地属性。ShowAlarm是动态的,但AlwaysShowGauge一旦设置就不会改变。我怎样才能做到这一点?
很难说出你的边界来自哪里,以及其中一个绑定来自哪里。但是您可以控制绑定流,这不是问题。主要问题是如何多触发,下面只是一个开始。一旦你看到如何进行多触发器,然后,你可以使用绑定,控制来自一个视图模型或视图属性的流,或者使用来自不同源的路径,为此,你可能必须将以下示例放在 DataTemplate 中并使用 SourceName 和 TargetName。但同样,很难说出边界在哪里。
<converters:OrMultiConverter x:Key="Or" />
<Style x:Key="MainBorderStyle" TargetType="{x:Type Border}">
<Setter Property="Visibility" Value="Hidden" />
<Style.Triggers>
MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Value="True">
<Condition.Binding>
<MultiBinding Converter="{StaticResource Or}">
<Binding Path="ShowAlarm"/>
<Binding Path="AlwaysShowGaug"/>
</MultiBinding>
</Condition.Binding>
</Condition>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Visibility" Value="Visible"/>
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
public class OrMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Any(value => value == null || value == DependencyProperty.UnsetValue))
return false;
var boolValues = values.Cast<bool>();
var result = boolValues.Any(b => b);
return result;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}