2009-05-20 23 views
1

私はWPF DataGridを使用していて、セルスタイルを集中化しようとしています。このリファクタリングでは、列ごとに異なる検証ロジックを知るためにセルスタイルが必要になりました。私は、(列ごとに異なるロジックを持つ)検証ロジックの結果を含み、DataGridCellスタイルでアクセス可能な、列オブジェクトに添付プロパティを提供することに決めました。残念ながら、Attached Propertyに結びついたMultiBindingは機能しません。AttachedPropertyをマルチバインディングのターゲットにするにはどうすればよいですか?

セルスタイルにはDataTriggerが含まれています。トリガーのバインディングパスは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); 
} 
を次のように私は(ValidatingDataGridという名前とデータグリッドを拡張している)私のDataGridクラスで添付プロパティを定義した

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

(スタイルのTargetTypeが列のプロパティを持つDataGridCell、あることに注意してください)

最後に、私のWPFページには、ValidationValue(列のAttachedProperty)をMultiBindingにバインドしようとするDataGridTextColumnがあります。私はこれを実行しようとすると

<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解析例外を取得:

メッセージ= "A 'MultiBindingの' を発生System.Windows.Markup.XamlParseExceptionはできません'DataGridTextColumn'タイプの 'SetValidationValue' プロパティに設定することができます。 'MultiBinding'は のみDependencyObjectのDependencyPropertyに設定できます。

ソース= "PresentationFramework"

行番号= 0

LinePosition = 0

のStackTrace:MS.Internal.Helper.CheckCanReceiveMarkupExtension(MarkupExtension markupExtension、IProvideValueTarget provideValueTarget、 のDependencyObject & targetDependencyObjectで 、DependencyProperty & targetDependencyProperty)

のInnerException:ヌル

私は静的な値(例えば、エラー)にValidationValueを設定した場合、値は適切DataTriggerに格納され、アクセスされることを知っています。

  1. 問題は実際に何か説明できますか? AttachedPropertyがDependencyPropertyであり、DataGridとDataGridColumnが両方ともDependencyObjectsであるため、例外メッセージの意味を理解できません。

  2. ValidationValue AttachedPropertyをMultiBindingにバインドする方法はありますか?そうでなければ、DataGridCellスタイルで読み込むことができるように、バインディングの結果を格納するためのWPFメカニズムがいくつかありますか?

答えて

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); 
    } 

    ... 
} 
+0

ありがとうございます。そのような愚かな間違いを作る:) –

関連する問題