1

ViewModel の 2 つのプロパティ、ConnectedVisibility と OperatingMode に基づいて有効または無効にしようとしている WPF の境界線があります。このデータ トリガーは、connectedvisibility の可視性が "Visible" に設定されていない場合、境界線を無効にします。ただし、OperatingMode では機能しません。0 以外の OperatingMode の場合、境界線は無効にする必要がありますが、有効なままです。OperatingMode がその値を変更してもまったく影響がないように見えます。プログラムが最初に起動するときを除いて、コンバーターに配置したブレークポイントでさえヒットしていません。これらのバインディングのデバッグ出力に問題が示されていないため、バインディングは問題ないように見えます。どんな助けでも大歓迎です。

スタイルは

<Style x:Key="EnableOnConnectBorderCorrected" TargetType="{x:Type Border}">
    <!--<Setter Property="BorderBrush" Value="#FFDADADA"/>-->
    <Setter Property="BorderBrush" Value="Red"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="CornerRadius" Value="2"/>
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding ConnectedVisibility}" Value="Visible"/>
                <Condition Binding="{Binding OperatingMode}" Value="0"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="IsEnabled" Value="True"/>
        </MultiDataTrigger>
        <DataTrigger Binding="{Binding OperatingMode, Converter={x:Static VM:IsEqualOrGreaterThanSHORTConverter.Instance}, ConverterParameter=1,Mode=TwoWay}" Value="True">
            <Setter Property="IsEnabled" Value="False"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding ConnectedVisibility}" Value="Collapsed">
            <Setter Property="IsEnabled" Value="False"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

スタイルで使用されるコンバーターは ->

public class IsEqualOrGreaterThanSHORTConverter : IValueConverter
{
    public static readonly IValueConverter Instance = new IsEqualOrGreaterThanSHORTConverter();

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        short iValue = (short)value;
        short compareToValue = System.Convert.ToInt16(parameter);

        return iValue >= compareToValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

このスタイルが適用される XAML は

<Border Name="RebootDash" Grid.Row="2" Grid.Column="1" Style="{StaticResource EnableOnConnectBorderCorrected}" BorderBrush="#FFDADADA" BorderThickness="1" CornerRadius="2" Width="Auto" Margin="0,1,1,0">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Border Grid.Row="2" Background="Wheat"/>
        <telerik:RadButton Command="{Binding ResetUnitCommand, Source={StaticResource UnitCommandProvider}}" Style="{StaticResource DashBoardImageButton}">
            <Image Grid.Row="0" Source="/Images/UnitManagementImages/IMG_THOR_UNITResetUnit128.png"
                   ToolTip="{x:Static properties:Resources.Unit_Command_ResetUnit}" 
                   Width="40" Height="40"
                   Margin="0,5,0,5"
                   HorizontalAlignment="Center"/>
        </telerik:RadButton>
        <TextBlock Grid.Row="2" Text="{x:Static properties:Resources.Unit_Command_ResetUnit}" HorizontalAlignment="Center" Margin="5,5,5,5"/>
    </Grid>
</Border>

バインドされるプロパティは次のとおりです。

public Visibility ConnectedVisibility
{
    get { return connectedVisibility; }
    set
    {
        if (connectedVisibility == value) return;
        connectedVisibility = value;
        RaisePropertyChanged("ConnectedVisibility");
    }
}

public short OperatingMode
{
    get { return UnitOperatingModeVM.OperatingMode; }
    set
    {
        UnitOperatingModeVM.OperatingMode = value;
    }
}
4

2 に答える 2

2

同じことを有効にする条件が1つしかないため、おそらくIsEnabledデフォルトで False に設定するとうまくいくはずです

<Style x:Key="EnableOnConnectBorderCorrected" TargetType="{x:Type Border}">
    <!--<Setter Property="BorderBrush" Value="#FFDADADA"/>-->
    <Setter Property="BorderBrush" Value="Red"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="CornerRadius" Value="2"/>
    <Setter Property="IsEnabled" Value="False"/>
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding ConnectedVisibility}" Value="Visible"/>
                <Condition Binding="{Binding OperatingMode}" Value="0"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="IsEnabled" Value="True"/>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

<Setter Property="IsEnabled" Value="False"/>デフォルトでコントロールを無効にするスタイルを追加し、他の冗長な条件を削除しました

結果として、MultiDataTrigger の両方の条件が満たされると同じものが有効になり、それ以外の場合は無効のままになります

上記の例では、MultiDataTrigger ConnectedVisibility&の両方のプロパティOperatingModeが変更を通知していると想定しています。


OperatingModeMultiDataTrigger がトリガーを起動するために、通知を追加する必要がある場合もあります

public short OperatingMode
{
    get { return UnitOperatingModeVM.OperatingMode; }
    set
    {
        UnitOperatingModeVM.OperatingMode = value;
        RaisePropertyChanged("OperatingMode");
    }
}
于 2014-09-13T04:34:35.940 に答える
0

あなたの OperatingMode プロパティ セットの実装は RaisePropertyChanged("OperatingMode"); を呼び出しますか?

private short operatingMode;
public short OperatingMode
{
    get
    {
        return operatingMode;
    }
    set
    {
        if (operatingMode != value)
        {
            operatingMode = value;
            this.RaisePropertyChanged("OperatingMode");
        }

    }
}
于 2014-09-13T07:43:09.493 に答える