1

私は WPF DataGrid を使用して、セル スタイルを一元化しようとしています。このリファクタリング中に、セル スタイルが列ごとに異なる検証ロジックを知る必要があることに気付きました。列オブジェクトに添付プロパティを提供することにしました。これには、検証ロジックの結果が含まれ (ロジックは列ごとに異なります)、DataGridCell スタイルでアクセスできます。残念ながら、添付プロパティに関連付けた MultiBinding は機能しません。

私のセル スタイルには、トリガーのバインド パスが添付プロパティである DataTrigger が含まれています。(スタイルの TargetType は、Column プロパティを持つ DataGridCell であることに注意してください)

<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 を拡張する) で添付プロパティを定義しました。

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 (列の 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 解析例外が発生します。

System.Windows.Markup.XamlParseException が発生しました

Message="「DataGridTextColumn」型の「SetValidationValue」プロパティに「MultiBinding」を設定することはできません。「MultiBinding」は、DependencyObject の DependencyProperty にのみ設定できます。"

ソース="プレゼンテーション フレームワーク"

行番号=0

ライン位置=0

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

内部例外: Null

ValidationValue を静的な値 (Error など) に設定すると、値が適切に格納され、DataTrigger にアクセスされることがわかっています。

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

  2. ValidationValue AttachedProperty を MultiBinding にバインドする方法はありますか? そうでない場合、バインディングの結果を保存して DataGridCell スタイルで読み取れるようにする他の WPF メカニズムはありますか?

4

1 に答える 1

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

    ...
}
于 2009-09-15T17:06:43.333 に答える