如何从C#ValidationRule访问WPF XAML GUI元素?

如何从C#ValidationRule访问WPF XAML GUI元素?,c#,wpf,validation,xaml,C#,Wpf,Validation,Xaml,我有一个WPF GUI,其中有两个字段分别命名为“one”和“two” “一”的值必须小于“二”的值。这由名为ValidateOne的ValidationRule进行测试 “2”的值必须大于“1”的值。这由名为validatewo的ValidationRule进行测试 谁能告诉我如何从我的C#ValidationRule访问XAML GUI元素,以便进行验证 我知道我需要将“MainWindow.1”和“MainWindow.2”替换为引用名为1和2的GUI元素的内容。我一直找不到该怎么做 我已

我有一个WPF GUI,其中有两个字段分别命名为“one”和“two”

“一”的值必须小于“二”的值。这由名为ValidateOne的ValidationRule进行测试

“2”的值必须大于“1”的值。这由名为validatewo的ValidationRule进行测试

谁能告诉我如何从我的C#ValidationRule访问XAML GUI元素,以便进行验证

我知道我需要将“MainWindow.1”和“MainWindow.2”替换为引用名为1和2的GUI元素的内容。我一直找不到该怎么做

我已经附上下面的代码

MainWindow.xaml

<Window x:Class="ValidateInput_Data.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ValidateInput_Data"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="10" />
            <RowDefinition Height="30" />
            <RowDefinition Height="10" />
            <RowDefinition Height="20" />
        </Grid.RowDefinitions>
        <Grid Grid.Row="1" Background="AliceBlue" ShowGridLines="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width=" 10" />
                <ColumnDefinition Width=" 40" />
                <ColumnDefinition Width=" 100" />
                <ColumnDefinition Width=" 40" />
                <ColumnDefinition Width=" 40" />
                <ColumnDefinition Width=" 100" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width=" 100" />
                <ColumnDefinition Width=" 10" />
            </Grid.ColumnDefinitions>
            <Label Content="One:" Grid.Column="1" />
            <TextBox x:Name="one" Grid.Column="2" Width="100" Height="23"
                     HorizontalAlignment="Left" VerticalAlignment="Center" TextWrapping="Wrap" >
                <TextBox.Text>
                <Binding Path="BoundOne" Mode="TwoWay" NotifyOnValidationError="True" ValidatesOnExceptions="True">
                    <Binding.ValidationRules>
                            <local:ValidateOne/>
                    </Binding.ValidationRules>
                </Binding>
                </TextBox.Text>
            </TextBox>
            <Label Content="Two:" Grid.Column="4" />
            <TextBox x:Name="two" Grid.Column="5" Width="100" Height="23"
                     HorizontalAlignment="Left" VerticalAlignment="Center" TextWrapping="Wrap">
                <TextBox.Text>
                    <Binding Path="BoundTwo" Mode="TwoWay" NotifyOnValidationError="True" ValidatesOnExceptions="True">
                        <Binding.ValidationRules>
                            <local:ValidateTwo/>
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>
        </Grid>
    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Windows;

namespace ValidateInput_Data
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public Int32 BoundOne { get; set; }
        public Int32 BoundTwo { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }
    }
}
使用系统;
使用System.Windows;
命名空间验证输入数据
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共Int32边界{get;set;}
public Int32 BoundTwo{get;set;}
公共主窗口()
{
初始化组件();
DataContext=this;
}
}
}
ValidateInput.cs

using System;
using System.Globalization;
using System.Windows.Controls;


namespace ValidateInput_Data
{
    public partial class ValidateOne : ValidationRule
    {
        public Int32 InputNumberOne { get; set; }
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            try
            {
                InputNumberOne = Int32.Parse((string)value);
                if (InputNumberOne < MainWindow.two)                // Missing Reference Error is Here
                { return ValidationResult.ValidResult; }
                else
                {
                    return new ValidationResult(false, "Invalid input.");
                }
            }
            catch (Exception e)
            {
                return new ValidationResult(false, "Illegal characters have been entered or " + e.Message);
            }
        }
    }
    public partial class ValidateTwo : ValidationRule
    {
        public Int32 InputNumberTwo { get; set; }
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            try
            {
                InputNumberTwo = Int32.Parse((string)value);
                if (InputNumberTwo > MainWindow.one)                // Missing Reference Error is Here
                { return ValidationResult.ValidResult; }
                else
                {
                    return new ValidationResult(false, "Invalid input.");
                }
            }
            catch (Exception e)
            {
                return new ValidationResult(false, "Illegal characters have been entered or " + e.Message);
            }
        }
    }
}
使用系统;
利用制度全球化;
使用System.Windows.Controls;
命名空间验证输入数据
{
公共部分类ValidateOne:ValidationRule
{
公共Int32 InputNumberOne{get;set;}
公共覆盖验证结果验证(对象值,CultureInfo CultureInfo)
{
尝试
{
InputNumberOne=Int32.Parse((字符串)值);
if(InputNumberOnemain window.one)//此处存在缺少引用错误
{返回ValidationResult.ValidResult;}
其他的
{
返回新的ValidationResult(false,“无效输入”);
}
}
捕获(例外e)
{
返回新的ValidationResult(false,“已输入非法字符”或“+e.Message”);
}
}
}
}
有人能帮忙吗


我使用Mark的引用解决了这个问题,我发现这对了解依赖属性非常有帮助

每个验证都需要一个绑定到另一个值的依赖项属性,您可以使用包装器实现该属性。演示如何执行此操作。谢谢Mark。非常感谢。