如何从C#ValidationRule访问WPF XAML GUI元素?
我有一个WPF GUI,其中有两个字段分别命名为“one”和“two” “一”的值必须小于“二”的值。这由名为ValidateOne的ValidationRule进行测试 “2”的值必须大于“1”的值。这由名为validatewo的ValidationRule进行测试 谁能告诉我如何从我的C#ValidationRule访问XAML GUI元素,以便进行验证 我知道我需要将“MainWindow.1”和“MainWindow.2”替换为引用名为1和2的GUI元素的内容。我一直找不到该怎么做 我已经附上下面的代码 MainWindow.xaml如何从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元素的内容。我一直找不到该怎么做 我已
<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。非常感谢。