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