Wpf 如何使AttachedProperty成为多重绑定的目标?

Wpf 如何使AttachedProperty成为多重绑定的目标?,wpf,data-binding,attached-properties,Wpf,Data Binding,Attached Properties,我一直在使用WPF数据网格,并试图集中我的单元格样式。在这个重构过程中,我遇到了一个需求,即我的单元格样式需要知道每个列的验证逻辑是不同的。我决定在我的column对象上提供一个附加属性,该属性将包含验证逻辑的结果(每列的逻辑不同),并且可以以DataGridCell样式访问。不幸的是,我绑定到附加属性的多重绑定不起作用 我的单元格样式包括一个DataTrigger,其中触发器的绑定路径是一个附加属性。(请注意,样式的TargetType是DataGridCell,它具有Column属性) 最后

我一直在使用WPF数据网格,并试图集中我的单元格样式。在这个重构过程中,我遇到了一个需求,即我的单元格样式需要知道每个列的验证逻辑是不同的。我决定在我的column对象上提供一个附加属性,该属性将包含验证逻辑的结果(每列的逻辑不同),并且可以以DataGridCell样式访问。不幸的是,我绑定到附加属性的多重绑定不起作用

我的单元格样式包括一个DataTrigger,其中触发器的绑定路径是一个附加属性。(请注意,样式的TargetType是DataGridCell,它具有Column属性)

最后,在我的WPF页面中,我有一个DataGridTextColumn,我试图将ValidationValue(该列的AttachedProperty)绑定到一个多重绑定

<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异常

Message=“无法在“SetValidationValue”上设置“多重绑定” 类型为“DataGridTextColumn”的属性。只能使用“多重绑定” 在DependencyObject的DependencyProperty上设置。“

Source=“PresentationFramework”

行号=0

LinePosition=0

堆栈跟踪: 在MS.Internal.Helper.CheckCanReceiveMarkupExtension(MarkupExtension markupExtension,IProviderValueTarget ProviderValueTarget, DependencyObject&targetDependencyObject,DependencyProperty& targetDependencyProperty)

InnerException:Null

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

  • 有人能解释一下问题到底是什么吗?我不理解异常消息的含义,因为AttachedProperty是DependencyProperty,DataGrid和DataGridColumn都是DependencyObject

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


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

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

    谢谢威尔-经过一点搜索后找到了你的答案。犯了这样一个愚蠢的错误:)谢谢威尔-经过一点搜索后找到了你的答案。犯这样愚蠢的错误:)
    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);
        }
    
        ...
    }