C# WPF基于MultiDataTrigger启用禁用边框不工作

C# WPF基于MultiDataTrigger启用禁用边框不工作,c#,wpf,xaml,datatrigger,multidatatrigger,C#,Wpf,Xaml,Datatrigger,Multidatatrigger,我试图基于viewmodel中的两个属性启用或禁用WPF中的边框:ConnectedVisibility和OperatingMode。当connectedvisibility未设置为“可见”时,此数据触发器将禁用边框。但它不适用于操作模式。对于0以外的操作模式,边框应被禁用,但仍保持启用状态。运行模式更改其值似乎没有任何影响。即使是我在转换器中设置的断点也不会被命中,除非程序第一次启动。这些绑定看起来正常,因为调试输出中显示的这些绑定没有问题。感谢您的帮助 风格是 <Style x:Key

我试图基于viewmodel中的两个属性启用或禁用WPF中的边框:ConnectedVisibility和OperatingMode。当connectedvisibility未设置为“可见”时,此数据触发器将禁用边框。但它不适用于操作模式。对于0以外的操作模式,边框应被禁用,但仍保持启用状态。运行模式更改其值似乎没有任何影响。即使是我在转换器中设置的断点也不会被命中,除非程序第一次启动。这些绑定看起来正常,因为调试输出中显示的这些绑定没有问题。感谢您的帮助

风格是

<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>
应用此样式的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>

由于您只有一个条件可以启用相同的功能,因此在默认情况下,将
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>

OperatingMode属性集实现调用RaisePropertyChanged(“OperatingMode”)是否已更改


谢谢你的回答。现在,即使两个条件都满足,样式也始终保持禁用状态。样式仍处于禁用状态。可能是因为setter总是启动,而MultiDataTrigger根本不启动
操作模式下
属性设置器也可以。如前所述,MultiDataTrigger仅在属性通知更改且具有正确值时才会激发。因此,将RaisePropertyChanged添加到OperatingMode,这样就可以了。
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;
    }
}
<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>
public short OperatingMode
{
    get { return UnitOperatingModeVM.OperatingMode; }
    set
    {
        UnitOperatingModeVM.OperatingMode = value;
        RaisePropertyChanged("OperatingMode");
    }
}
private short operatingMode;
public short OperatingMode
{
    get
    {
        return operatingMode;
    }
    set
    {
        if (operatingMode != value)
        {
            operatingMode = value;
            this.RaisePropertyChanged("OperatingMode");
        }

    }
}