1

我一直在使用 WPF DataGrid 并尝试集中我的单元格样式。在此重构过程中,我发现我的单元格样式需要了解每一列的不同验证逻辑。我决定在我的列对象上提供一个附加属性,该属性将包含我的验证逻辑的结果(每列的逻辑不同)并且可以在我的 DataGridCell 样式中访问。不幸的是,我绑定到附加属性的 MultiBinding 不起作用。

我的单元格样式包括一个 DataTrigger,其中触发器的绑定路径是一个附加属性。(注意样式的 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>

我在我的 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 Parse Exception:

System.Windows.Markup.XamlParseException 发生

Message="无法在“DataGridTextColumn”类型的“SetValidationValue”属性上设置“MultiBinding”。只能在 DependencyObject 的 DependencyProperty 上设置“MultiBinding”。

来源="演示框架"

行号=0

线位置=0

StackTrace:在 MS.Internal.Helper.CheckCanReceiveMarkupExtension(MarkupExtension markupExtension,IProvideValueTarget provideValueTarget,DependencyObject& targetDependencyObject,DependencyProperty& targetDependencyProperty)

内部异常:空

我知道,如果我将 ValidationValue 设置为静态值(例如 Error),则该值会在 DataTrigger 中正确存储和访问。

  1. 谁能解释这个问题实际上是什么?我不明白异常消息的含义,因为 AttachedProperty 是一个 DependencyProperty,而 DataGrid 和 DataGridColumn 都是 DependencyObjects。

  2. 有没有办法将 ValidationValue AttachedProperty 绑定到 MultiBinding?如果没有,是否有其他 WPF 机制可以让我存储绑定的结果,以便我的 DataGridCell 样式可以读取它?

4

1 回答 1

4

我刚刚遇到了同样令人困惑的异常的同样问题。您需要将依赖属性的所有者类型设置为具有 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);
    }

    ...
}
于 2009-09-15T17:06:43.333 回答