Я работаю с WPF DataGrid и пытаюсь централизовать стиль моей ячейки. Во время этого рефакторинга я столкнулся с необходимостью для моего стиля ячейки знать логику проверки, которая различна для каждого столбца. Я решил предоставить вложенное свойство для моего объекта столбца, который будет содержать результат моей логики проверки (с разной логикой для каждого столбца) и быть доступным в моем стиле DataGridCell. К сожалению, MultiBinding, который я привязал к свойству Attached, не работает.
Мой стиль ячейки включает DataTrigger, где путь привязки триггера является Attached Property. (Обратите внимание, что TargetType стиля является DataGridCell, который имеет свойство Column)
<DataTrigger Value="Error">
<DataTrigger.Binding>
<Binding Converter="{StaticResource debugConverter}"
RelativeSource="{RelativeSource Self}"
Path="Column.ValidationValue" Mode="OneWay" />
</DataTrigger.Binding>
<Setter Property="BorderBrush" Value="{StaticResource errorBrush}" />
</DataTrigger>
Я определил свойство Attached в своем классе DataGrid (который называется ValidatingDataGrid и расширяет DataGrid) следующим образом:
public static readonly DependencyProperty ValidationValueProperty =
DependencyProperty.RegisterAttached("ValidationValue", typeof(object),
typeof(DataGridColumn));
public static object GetValidationValue(DependencyObject element)
{
return element.GetValue(ValidationValueProperty);
}
public static void SetValidationValue(DependencyObject element, object value)
{
element.SetValue(ValidationValueProperty, value);
}
Наконец, на моей странице WPF у меня есть DataGridTextColumn, где я пытаюсь привязать ValidationValue (AttachedProperty столбца) к MultiBinding.
<vfc:ValidatingDataGrid>
<vfc:ValidatingDataGrid.Columns>
<tk:DataGridTextColumn Header="Name" Width="1.5*">
<tk:DataGridTextColumn.Binding>
<Binding Path="Name" />
</tk:DataGridTextColumn.Binding>
<vfc:ValidatingDataGrid.ValidationValue>
<MultiBinding Converter="{StaticResource validityConverter}"
ConverterParameter="Name">
<Binding Mode="OneWay" />
<Binding Path="Name" UpdateSourceTrigger="PropertyChanged" />
</MultiBinding>
</vfc:ValidatingDataGrid.ValidationValue>
Однако, когда я пытаюсь выполнить это, я последовательно получаю Исключение синтаксического анализа XAML:
Произошло исключение System.Windows.Markup.XamlParseException
Сообщение = "MultiBinding" не может быть установлен на "SetValidationValue"
свойство типа 'DataGridTextColumn'. «MultiBinding» может быть только
установлен на DependencyProperty объекта DependencyObject. "
Источник = "PresentationFramework"
LineNumber = 0
LinePosition = 0
StackTrace:
в MS.Internal.Helper.CheckCanReceiveMarkupExtension (MarkupExtension
markupExtension, IProvideValueTarget provideValueTarget,
DependencyObject & targetDependencyObject, DependencyProperty &
targetDependencyProperty)
InnerException: Null
Я знаю, что если я установлю ValidationValue в статическое значение (например, Error), это значение будет правильно сохранено и получит доступ в DataTrigger.
Может кто-нибудь объяснить, в чем проблема на самом деле? Я не понимаю, что означает сообщение об исключении, поскольку AttachedProperty является DependencyProperty, а DataGrid и DataGridColumn оба являются DependencyObjects.
Есть ли способ привязать свойство ValidationValue AttachedProperty к MultiBinding? Если нет, есть ли какой-нибудь другой механизм WPF, который позволит мне сохранить результат привязки, чтобы мой стиль DataGridCell мог его прочитать?