Я хотел бы расширить некоторые стандартные UIElements в моем WPF. В идеале было бы хорошим решением использовать приложенные свойства. Но мне это не удалось.Прикрепленное свойство, связанное с перечнем через конвертер
В моей ViewModel Я коллекцию пользовательских объектов:
private ObservableCollection<ValidationFailure> validationFailures = new ObservableCollection<ValidationFailure>();
public ObservableCollection<ValidationFailure> ValidationFailures
{
get { return validationFailures; }
set
{
validationFailures = value;
OnPropertyChanged(() => ValidationFailures);
}
}
Это то, что я хотел бы связать с моей Attached собственности. На мой взгляд, я также связываю его как ItemSource ListBox. Он показывает изменения и все правильно, поэтому я думаю, что сборник хорошо уведомляет.
На мой взгляд, я связываю это с помощью следующего кода:
<TextBox x:Name="ssn" Grid.Row="0" Grid.Column="1" Margin="10,0,0,0"
Text="{Binding PatientAggRoot.Patient.Ssn}"
Background="{Binding Path=CheckSsnButtonBackground}"
Validation:ValidationErrorAttached.HasValidationErrors="{Binding ValidationFailures,Converter={x:Static Converters:ConvertersHolder.ValidationErrorsLookupConverter},ConverterParameter='SSN',Mode=OneWay}"
/>
Мой конвертер выглядит как эти:
public class ValidationErrorsLookupConverter : IValueConverter
{
#region IValueConverter implementation
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (value != null)
{
var validationLookup = (ObservableCollection<ValidationFailure>)value;
bool hasErrors = validationLookup.Any(vf => vf.Key == ((string) parameter));
return hasErrors;
}
return null;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException("Can't convert back");
}
#endregion
}
Я тестировал параметр преобразователя, он также работает должным образом с ListBox; Наконец мое вложенное свойство:
public static readonly DependencyProperty HasValidationErrorsProperty = DependencyProperty.RegisterAttached("HasValidationErrors", typeof(Boolean), typeof(ValidationErrorAttached), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnChangeCallBack, OnCoerceValueChanged));
private static object OnCoerceValueChanged(DependencyObject d, object basevalue)
{
//throw new NotImplementedException();
return basevalue;
}
private static void OnChangeCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//throw new NotImplementedException();
if (((bool)e.NewValue))
{
((TextBox) d).BorderBrush = Brushes.Red;
}
}
public static void SetHasValidationErrors(UIElement element, Boolean value)
{
element.SetValue(HasValidationErrorsProperty, value);
}
public static Boolean GetHasValidationErrors(UIElement element)
{
return (Boolean)element.GetValue(HasValidationErrorsProperty);
}
Он находится в классе ValidationErrorAttached, который является Freezable класса.
Когда я открываю форму, содержащую текстовое поле выше, coervalue Attached Property запускается 2 раза, меняет обратный вызов один раз, но после того, как (форма загружена), я меняю коллекцию на своей виртуальной машине и на основе коллекции конвертер изменит возвращаемое значение, подключенные свойства обратных вызовов не срабатывают, как я ожидал. Что я не так?
У вас есть ошибки проверки по умолчанию? –
Вообще-то может быть, но не в моем тестовом примере: Вскоре нет. но коллекция не является нулевой, просто пустой. –
Это похоже на проблему, она собирает событие Collection.Add? –