如何在 Validate.HasError 期间在工具栏按钮上调用 DataTrigger

How to invoke DataTrigger on a Toolbar Button during Validate.HasError

我已经实现了以下 xaml 代码来禁用工具栏按钮 Validation.HasError 基于根据 UserAccountValidationRule

输入到 ComboBox 中的文本

核心 xaml 代码显示如下:

    <telerik:RadComboBox
        x:Name="DataProviderComboBox" Width="120" Height="23" IsEditable="True" DataContext="{StaticResource MainWindowViewModel}">
        <telerik:RadComboBox.Text>
            <Binding Mode="TwoWay" Path="InputString">
                <Binding.ValidationRules>
                    <validationRules:UserAccountValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </telerik:RadComboBox.Text>
    </telerik:RadComboBox>

    <telerik:RadButton
        Name="ToolbarButton" Width="74" HorizontalAlignment="Left" VerticalAlignment="Top" Content="Button">
        <telerik:RadButton.Style>
            <Style TargetType="{x:Type telerik:RadButton}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding (Validation.HasError), ElementName=DataProviderComboBox}" Value="true" >
                        <Setter Property="IsEnabled" Value="false"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </telerik:RadButton.Style>
    </telerik:RadButton>

</telerik:RadToolBar>

<Grid>
    <telerik:RadButton 
        Name="OrdinaryButton" Width="74" HorizontalAlignment="Left" VerticalAlignment="Top" Content="Button" Margin="252,26,0,0">
        <telerik:RadButton.Style>
            <Style TargetType="{x:Type telerik:RadButton}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding (Validation.HasError), ElementName=DataProviderComboBox}" Value="true" >
                        <Setter Property="IsEnabled" Value="false"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </telerik:RadButton.Style>
    </telerik:RadButton>
</Grid>

我想要的是调用 ToolBarButton 中的 DataTrigger,但事实并非如此。

我通过创建第二个 OrdinarryButton 来检查验证,并将其连接到验证,这工作正常。如果按钮是工具栏项,似乎 DataTrigger 不起作用。

谁能解释一下如何让它工作?

因此,事实证明,如果按钮是 OrdinaryButton 控件,则将调用 DataTrigger 并通过下面的 xaml 代码在 Validation.HasError = true 时禁用按钮:

<Grid>
    <telerik:RadButton 
        Name="OrdinaryButton" Width="74" HorizontalAlignment="Left" VerticalAlignment="Top" Content="Button" Margin="252,26,0,0">
        <telerik:RadButton.Style>
            <Style TargetType="{x:Type telerik:RadButton}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding (Validation.HasError), ElementName=DataProviderComboBox}" Value="true" >
                        <Setter Property="IsEnabled" Value="false"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </telerik:RadButton.Style>
    </telerik:RadButton>
</Grid>

但是,如果按钮控件放在 ToolbarButton 内,相同的 xaml 代码将不会禁用工具栏按钮:

    <telerik:RadComboBox
        x:Name="DataProviderComboBox" Width="120" Height="23" IsEditable="True" DataContext="{StaticResource MainWindowViewModel}">
        <telerik:RadComboBox.Text>
            <Binding Mode="TwoWay" Path="InputString">
                <Binding.ValidationRules>
                    <validationRulesParameterPass:UserAccountValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </telerik:RadComboBox.Text>
    </telerik:RadComboBox>

    <telerik:RadButton
        Name="ToolbarButton" Width="74" HorizontalAlignment="Left" VerticalAlignment="Top" Content="Button">
        <telerik:RadButton.Style>
            <Style TargetType="{x:Type telerik:RadButton}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding (Validation.HasError), ElementName=DataProviderComboBox}" Value="true" >
                        <Setter Property="IsEnabled" Value="false"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </telerik:RadButton.Style>
    </telerik:RadButton>

</telerik:RadToolBar>

我觉得这很奇怪,这可能是一个以前未发现的错误?如果有人知道这是否是预期的行为,并且有观察到的行为的原因,请随时 post。

与此同时,我花了一些时间开发可接受的解决方法。

在这种情况下,我修改了 <validationRules:UserAccountValidationRule/> 以采用传递单个布尔 IsEnabled 属性:

的参数
                <Binding.ValidationRules>
                    <validationRulesParameterPass:UserAccountValidationRule>
                        <validationRulesParameterPass:UserAccountValidationRule.AccountValidationParameter>
                            <validationRulesParameterPass:AccountValidationParameter IsEnabled="{Binding IsButtonEnabled, Source={StaticResource MainWindowViewModel}}" />
                        </validationRulesParameterPass:UserAccountValidationRule.AccountValidationParameter>
                    </validationRulesParameterPass:UserAccountValidationRule>
                </Binding.ValidationRules>

我还将 IsButtonEnabled 依赖项 属性 属性 绑定到工具栏按钮项的 IsEnabled 属性。

然后,在 UserAccountValidationRule 内部,根据值是否有效,IsButtonEnabled 属性 将设置为 true 或 false。由于此 DependencyProperty 连接到工具栏按钮,如果验证将此设置为真,则按钮的 IsEnabled 属性 也将设置为真,反之亦然。

public class UserAccountValidationRule : ValidationRule
{
    private AccountValidationParameter _accountValidationParameter;

    public UserAccountValidationRule()
    {

    }
    public AccountValidationParameter AccountValidationParameter
    {
        get { return _accountValidationParameter; }
        set { _accountValidationParameter = value; }
    }

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {

        if ( !string.IsNullOrEmpty(value as string) && value as string == "good")
        {
            AccountValidationParameter.IsEnabled = true;
            return new ValidationResult(true, null);
        }
        else
        {

            AccountValidationParameter.IsEnabled = false;

            return new ValidationResult(false, "bad string.");
        }
    }
}

问题已解决。