如何将附加属性作为MultiBinding的目标?

时间:2009-05-20 01:58:38

标签: wpf data-binding attached-properties

我一直在使用WPF DataGrid并尝试集中我的单元格样式。在这个重构期间,我遇到了对我的单元格样式的需求,以了解每列的不同验证逻辑。我决定在我的列对象上提供一个附加属性,它包含我的验证逻辑的结果(每列的逻辑不同)并且可以在我的DataGridCell样式中访问。不幸的是,我绑定到Attached Property的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类中定义了Attached属性(名为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(Column的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异常:

  

发生了System.Windows.Markup.XamlParseException

     

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

     

源= “PresentationFramework”

     

LineNumber上= 0

     

LinePosition = 0

     

堆栈跟踪:          在MS.Internal.Helper.CheckCanReceiveMarkupExtension(MarkupExtension   markupExtension,IProvideValueTarget提供ValueTarget,   DependencyObject的&安培; targetDependencyObject,DependencyProperty&amp;   targetDependencyProperty)

     

InnerException:Null

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

  1. 任何人都可以解释实际问题是什么吗?我不明白异常消息的含义,因为AttachedProperty是DependencyProperty,而DataGrid和DataGridColumn都是DependencyObjects。

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

1 个答案:

答案 0 :(得分:4)

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

    ...
}