从 ViewModel 绑定 ValidationRule

Binding ValidationRule from ViewModel

我需要使用我的 ModelView

中的列表 'lFx'
<TextBox Grid.Row="2" Grid.Column="0"
         Style="{StaticResource StyleTxtErr}"
         Validation.ErrorTemplate="{StaticResource ValidationGrp}"
         >
    <TextBox.Text>
        <Binding Path="sGrp" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
         <Binding.ValidationRules>
                <local:cDataGrpRule lFx="{Binding lFx}"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

实际上,这段代码在“ 不能将绑定设置为 lFx,...
绑定只能设置为 DependenxyObject 的 DependencyProperty

如何使用我的 ViewModel 中设置的对象初始化我的 ValidationRule 对象?

提前致谢。 埃里克

由于您只能绑定到依赖项 属性,正如错误消息所解释的那样,您将创建一个包装器 class,它派生自 DependencyObject 并公开一个依赖项 属性.

您还需要一个捕获当前 DataContext:

的代理对象
public class BindingProxy : Freezable
{
    protected override Freezable CreateInstanceCore() => new BindingProxy();

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy),
        new PropertyMetadata(null));
}

然后你添加一个 CLR 属性 到 ValidationRule class 即 returns 这个包装器类型的一个实例:

public class cDataGrpRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        //your validation logic...
        return ValidationResult.ValidResult;
    }

    public Wrapper Wrapper { get; set; }
}

public class Wrapper : DependencyObject
{
    public static readonly DependencyProperty lFxProperty =
         DependencyProperty.Register("lFx", typeof(object), typeof(Wrapper));

    public object lFx
    {
        get { return GetValue(lFxProperty); }
        set { SetValue(lFxProperty, value); }
    }
}

您可能要考虑重命名 属性 以符合 C# 命名约定。

XAML:

<TextBox Grid.Row="2" Grid.Column="0"
         Style="{StaticResource StyleTxtErr}"
         Validation.ErrorTemplate="{StaticResource ValidationGrp}">
    <TextBox.Resources>
        <local:BindingProxy x:Key="proxy" Data="{Binding}"/>
    </TextBox.Resources>
    <TextBox.Text>
        <Binding Path="sGrp" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <local:cDataGrpRule>
                    <local:cDataGrpRule.Wrapper>
                        <local:Wrapper lFx="{Binding Data.lFx, Source={StaticResource proxy}}"/>
                    </local:cDataGrpRule.Wrapper>
                </local:cDataGrpRule>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

请参阅 this article 了解更多信息和完整示例。