我一直在使用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类(名为ValidatingDataGrid并扩展DataGrid)中定义了Attached属性,如下所示:
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 =“无法在'DataGridTextColumn'类型的'SetValidationValue'属性上设置''MultiBinding' . 'MultiBinding'只能在DependencyObject的DependencyProperty上设置 . ” Source =“PresentationFramework”LineNumber = 0 LinePosition = 0 StackTrace:at MS.Internal.Helper.CheckCanReceiveMarkupExtension(MarkupExtension markupExtension,IProvideValueTarget provideValueTarget,DependencyObject&targetDependencyObject,DependencyProperty&targetDependencyProperty)InnerException:Null
我知道如果我将ValidationValue设置为静态值(例如,Error),则可以在DataTrigger中正确存储和访问该值 .
-
任何人都可以解释实际问题是什么吗?我不明白异常消息的含义,因为AttachedProperty是DependencyProperty,而DataGrid和DataGridColumn都是DependencyObjects .
-
有没有办法将ValidationValue AttachedProperty绑定到MultiBinding?如果没有,是否有其他WPF机制可以让我存储绑定的结果,所以我的DataGridCell样式可以读取它?
1 回答
我只是遇到了同样令人困惑的异常问题 . 您需要将depenency属性的所有者类型设置为具有Setxxx和Getxxx方法的类,而不是要使用该属性的类 . 如果方法在ValidatingDataGrid中,您应该像这样注册属性: