从代码隐藏在 XAML 中添加验证规则

本文关键字:添加 验证 规则 XAML 代码 隐藏 | 更新日期: 2023-09-27 17:57:10

我正在尝试从代码隐藏向 XAML 添加验证规则,并且需要这个:

<TextBox.Text>
   <Binding Path="Model.txt1.Value" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True">
      <Binding.ValidationRules>
         <localVal:RequiredValidate />
      </Binding.ValidationRules>
   </Binding>
</TextBox.Text>

到目前为止,我已经尝试过:

FrameworkElement SelectedObject = fe_dragged_control;
DependencyProperty property =                           
    ControlBindingExtensions.GetDependencyPropertyFromName("Text", SelectedObject.GetType());
Binding binding = new Binding("Model." + SelectedObject.Name + ".Value");
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
binding.ValidatesOnDataErrors = true;
RequiredValidate role = new RequiredValidate();
binding.ValidationRules.Add(role);
SelectedObject.SetBinding(property, binding);

我在谷歌上找到了这个,但我得到了以下结果(为了可读性,删除了不相关的属性:

<TextBox Text="{Binding ValidatesOnDataErrors=True, 
                Path=Model.txt0.Value, 
                UpdateSourceTrigger=PropertyChanged}" >

我如何获得我需要的结果(第一个代码)?谢谢

从代码隐藏在 XAML 中添加验证规则

您应该检查您的视图模型。您的示例使用以下测试用例。

<TextBox x:Name="Txt0">

验证

using System.Globalization;
using System.Windows.Controls;
namespace WpfApplication2
{
    public class RequiredValidate : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            return value != null ? ValidationResult.ValidResult : new ValidationResult(false, "Value required");
        }
    }
}

代码隐藏

    private void InitializeValidation()
    {
        FrameworkElement SelectedObject = Txt0;
        DependencyProperty property =
            GetDependencyPropertyByName(SelectedObject, "TextProperty");
        Binding binding = new Binding("Model.Txt0");
        binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
        binding.ValidatesOnDataErrors = true;
        RequiredValidate role = new RequiredValidate();
        binding.ValidationRules.Add(role);
        SelectedObject.SetBinding(property, binding);
    }
    public static DependencyProperty GetDependencyPropertyByName(DependencyObject dependencyObject, string dpName)
    {
        return GetDependencyPropertyByName(dependencyObject.GetType(), dpName);
    }
    public static DependencyProperty GetDependencyPropertyByName(Type dependencyObjectType, string dpName)
    {
        DependencyProperty dp = null;
        var fieldInfo = dependencyObjectType.GetField(dpName, BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
        if (fieldInfo != null)
        {
            dp = fieldInfo.GetValue(null) as DependencyProperty;
        }
        return dp;
    }

和视图模型

public class MainWindowViewModel
{
    public MainWindowViewModel()
    {
        Model = new Model();
    }
    public Model Model { get; set; }
}
public class Model
{
    public Model()
    {
        Txt0 = 42;
        Txt1 = 99;
    }
    public int? Txt0 { get; set; }
    public int? Txt1 { get; set; }
}