Я новичок в WPF и имею проблему с проверкой связанной коллекции.
У меня есть DataGrid, который ограничен коллекцией полиморфных объектов, сгруппированных вместе.
DataGrid имеет два столбца:
- Lable oneTime, привязанное к отображаемому имени
- TextBox TwoWay, ограниченный значением, когда TextBox LostFocus
Каждая строка DataGrid ограниченаодин объект из базового класса.Каждый производный класс имеет свой собственный метод проверки, и я пытаюсь выполнить соответствующий метод проверки для TextBox на основе экземпляра производного класса.
Я могу связать проверку на основе ExceptionValidationRule, но производительность нетак хорошо, и приложение мигает, поскольку у него много исключений.Я также знаю, что могу это сделать, вызвать событие TextBox LostFocus и получить исходный объект, но я пытаюсь использовать проверку WPF для ограниченных объектов, если это возможно.
Я пытался унаследовать ValidationRule в базекласс и передать его, но он входит с базовым классом в функцию, а не с производным ограниченным элементом. Я попытался создать отдельные классы, которые реализуют ValidationRule и DependencyObject, и я пытаюсь передать ему исходный объект, как описано здесь: http://dedjo.blogspot.com/2007/05/fully-binded-validation-by-using.html
Но я все еще не могу заставить его работать.Для простоты я создал объект DependencyObject со свойством TestString и попытался привязать его к отображаемому имени (ограниченный путь метки).Но набор TestString никогда не вызывается.
Как я могу это сделать?Как я могу вызвать соответствующий метод проверки?Могу ли я каким-то образом передать ограниченный объект в Оценщик?
Спасибо за вашу помощь, Сарит
Используемый код:
Класс реализации DependencyObject:
class ManifestPropertyDependency : DependencyObject
{
private ManifestProperty _manifestPropertyInstance;
public ManifestProperty ManifestPropertyInstance
{
get { return (ManifestProperty)GetValue(ManifestPropertyInstanceProp); }
set
{
SetValue(ManifestPropertyInstanceProp, value);
}
}
private string testString;
public string TestString {
get { return (string)GetValue(TestStringProp); }
set { SetValue(TestStringProp, value); }
}
public ManifestPropertyDependency()
{
testString = "";
_manifestPropertyInstance = new ManifestProperty();
}
public static readonly DependencyProperty ManifestPropertyInstanceProp =
DependencyProperty.Register("ManifestPropertyInstance", typeof(ManifestProperty),
typeof(ManifestPropertyDependency), new UIPropertyMetadata(new ManifestProperty()));
public static readonly DependencyProperty TestStringProp =
DependencyProperty.Register("TestString", typeof(string),
typeof(ManifestPropertyDependency), new UIPropertyMetadata(""));
}
Класс реализации ValidationRule:
class ManifestPropertyValidator : ValidationRule
{
private ManifestProperty _manifest;
private ManifestPropertyDependency _manifestPropertyDependency;
public string Stam { get { return _manifestPropertyDependency.TestString; } set { _manifestPropertyDependency.TestString = value; } }
public ManifestPropertyDependency ManifestPropertyDependency
{
get { return _manifestPropertyDependency; }
set
{
_manifestPropertyDependency = value;
Stam = value.TestString;
_manifest = value.ManifestPropertyInstance;
}
}
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
try
{
string errorMessage = "";
if (ManifestPropertyDependency.ManifestPropertyInstance.ValidateString((string)value, ref errorMessage))
{
return new ValidationResult(true, null);
}
return new ValidationResult(false, errorMessage);
}
catch (Exception e)
{
return new ValidationResult(false, "Illegal characters or " + e.Message);
}
}
}
Xaml проверки:
<TextBox Validation.ErrorTemplate="{StaticResource validationTemplate}"
Style="{StaticResource textStyleTextBox}">
<TextBox.Text>
<Binding Path="Value" Mode="TwoWay"
UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<Classes:ManifestPropertyValidator>
<Classes:ManifestPropertyValidator.ManifestPropertyDependency>
<Classes:ManifestPropertyDependency TestString="{Binding Path=DisplayName}"/>
</Classes:ManifestPropertyValidator.ManifestPropertyDependency>
</Classes:ManifestPropertyValidator>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>