Как сделать AttachedProperty целью MultiBinding? - PullRequest
1 голос
/ 20 мая 2009

Я работаю с 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.

  1. Может кто-нибудь объяснить, в чем проблема на самом деле? Я не понимаю, что означает сообщение об исключении, поскольку AttachedProperty является DependencyProperty, а DataGrid и DataGridColumn оба являются DependencyObjects.

  2. Есть ли способ привязать свойство ValidationValue AttachedProperty к MultiBinding? Если нет, есть ли какой-нибудь другой механизм WPF, который позволит мне сохранить результат привязки, чтобы мой стиль DataGridCell мог его прочитать?

1 Ответ

4 голосов
/ 15 сентября 2009

Я только что столкнулся с той же проблемой с тем же запутанным исключением. Вам нужно установить тип владельца свойства зависимостей, чтобы он был классом с методами Setxxx и Getxxx, а не классом, для которого вы хотите использовать это свойство. Если методы в ValidatingDataGrid, вы должны зарегистрировать свойство следующим образом:

public class ValidatingDataGrid
{
    ... 

    public static readonly DependencyProperty ValidationValueProperty =
        DependencyProperty.RegisterAttached(
            "ValidationValue",
            typeof(object),
            typeof(ValidatingDataGrid)
            );

    public static void SetValidationValue(DependencyObject element, object value)
    {
        element.SetValue(ValidationValueProperty, value);
    }

    public static object GetValidationValue(DependencyObject element)
    {
        return (object)element.GetValue(ValidationValueProperty);
    }

    ...
}
...