У меня есть графический интерфейс WPF с двумя полями с именами «один» и «два» соответственно.
Значение «один» должно быть меньше значения «два». Это проверяется ValidationRule под названием ValidateOne.
Значение «два» должно быть больше, чем значение «один». Это проверяется ValidationRule под названием ValidateTwo.
Может ли кто-нибудь сказать мне, как я могу получить доступ к элементам графического интерфейса XAML из моего C# ValidationRule, чтобы я мог выполнить проверку?
Я знаю, что мне нужно заменить «MainWindow.one» и «MainWindow.two» чем-то, что ссылается на элементы графического интерфейса с именами «один» и «два». Я не мог найти, как это сделать.
Я прикрепил код ниже.
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;
}
}
}
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);
}
}
}
}
Кто-нибудь может помочь?
Я решил это, используя ссылки Марка Передайте параметр в класс ValidationRule и WPF: передача значения, связанного с данными, в правило проверки, которые я нашел наиболее полезными со ссылкой на 2000 вещей, которые вы должны знать о WPF, чтобы узнать о свойствах зависимостей.
Спасибо, Марк. Наиболее ценится.





Для каждой проверки требуется свойство зависимости, которое связывается с другим значением, которое можно реализовать с помощью оболочки. эта статья показывает, как это сделать.