0

一連のゲージ ユーザー コントロールをロードするユーザー コントロールに次の 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 は一度設定すると変更されません。どうすればこれを達成できますか?

4

1 に答える 1

0

境界線がどこから来たのか、バインディングの 1 つがどこから来たのかを判断するのは困難です。しかし、Binding フローを制御することはできます。それは問題ではありません。主な問題は、どのようにマルチトリガーを行うかです。以下はほんの始まりです。マルチトリガーの方法がわかったら、バインディングを操作して、1 つのビュー モデルまたはビュー プロパティからフローを制御するか、さまざまなソースからのパスを操作して、次のサンプルを配置する必要があります。 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();
    }
}
于 2012-04-20T21:05:06.540 に答える