0

DataGridTextColumnにカスタム添付プロパティを定義し、それに対してDataTriggerをxamlファイルに書き込んでいます。添付プロパティ(FilterDisplayStyle)がクラスでどのように定義されているかを次に示します。

//Dependency Property whether Column Filter is combobox or textbox or editable combobox.
public static FrameworkPropertyMetadata inheritsMetaData = 
    new FrameworkPropertyMetadata(FilterDisplayTypeEnum.TextBoxOnly, FrameworkPropertyMetadataOptions.Inherits);

public static DependencyProperty FilterDisplayTypeProperty = DependencyProperty.RegisterAttached("FilterDisplayType",
         typeof(FilterDisplayTypeEnum), typeof(DataGridColumn), inheritsMetaData);

public static FilterDisplayTypeEnum GetFilterDisplayType(DependencyObject target) {
    if (target == null) { throw new ArgumentNullException("Invalid Parameter Element"); }
    return (FilterDisplayTypeEnum)target.GetValue(FilterDisplayTypeProperty);
}

public static void SetFilterDisplayType(DependencyObject target, FilterDisplayTypeEnum value) {
    if (target == null) { throw new ArgumentNullException("Invalid Parameter Element"); }
    target.SetValue(FilterDisplayTypeProperty, value);
}

上記の添付プロパティのタイプは、以下のように定義されているFilterDisplayTypeEnumです。

public enum FilterDisplayTypeEnum {
    TextBoxOnly,
    NonEditableComboBox,
    EditableComboBox
}

DataGridTextColumnでこのプロパティを設定する方法は次のとおりです

<DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Id}" f:DataGridColumnExtensions.FilterDisplayType="NonEditableComboBox" />
....

</DataGrid.Columns>

今、私は以下を使用してこのプロパティを取得しようとしています

<TextBox Text="{Binding Mode=OneWay, Path=FilterDisplayType, RelativeSource={RelativeSource AncestorType={x:Type DataGridTextColumn}}}"/>

しかし、上記のTextBoxにテキストが表示されません。

驚いたことに、完全に正常に機能する別のアタッチされたプロパティ(今回は代わりにDataGridにアタッチされています)があります。問題はDataGridTextColumnでのみ発生します。また、WPF Inspectorを使用すると、ビジュアルツリーにDataGridTextColumnの直接的な視覚的表現がないことがわかります。そのため、DataGridTextColumnである祖先をバインドするFindAncestorの方法を使用できるかどうかについては懐疑的でした。誰かがこのシナリオで私を助けることができますか?要約すると、FindAncestorタイプのBindingを使用してDataGridTextColumnで定義されたカスタム添付プロパティにアクセスできません。これに代わるものはありますか?

よろしく、ニルヴァン

編集: @Clemensの提案に従って、添付プロパティの定義を次のように変更しました。しかし、xamlの添付プロパティにアクセスできません。

添付プロパティの定義:

    public static DependencyProperty FilterDisplayTypeProperty = DependencyProperty.RegisterAttached("FilterDisplayType",
             typeof(FilterDisplayTypeEnum), typeof(DataGridColumnExtensions), inheritsMetaData);

public static FilterDisplayTypeEnum GetFilterDisplayType(DataGridBoundColumn target) {
        if (target == null) { throw new ArgumentNullException("Invalid Parameter target"); }
        return (FilterDisplayTypeEnum)target.GetValue(FilterDisplayTypeProperty);
    }

    public static void SetFilterDisplayType(DataGridBoundColumn target, FilterDisplayTypeEnum value) {
        if (target == null) { throw new ArgumentNullException("Invalid Parameter target"); }
        target.SetValue(FilterDisplayTypeProperty, value);
    }

以下に示すように、xamlコードのプロパティ「FilterDisplayType」にまだアクセスできません

<TextBox Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridTextColumn}}, Path=FilterDisplayType}"/>
4

1 に答える 1

1

所有者の型は、プロパティを宣言する型である必要がありますDataGridColumnExtensions

public static DependencyProperty FilterDisplayTypeProperty =
    DependencyProperty.RegisterAttached("FilterDisplayType", 
         typeof(FilterDisplayTypeEnum),
         typeof(DataGridColumnExtensions), // here
         inheritsMetaData);

これは、添付プロパティに関する一般的な誤解のようです。こちらもご覧ください

また、添付プロパティにバインドするための構文(Class.Property)はであるため、次のようにバインドする必要があることに注意してください。

<TextBox
    Text="{Binding Path=(DataGridColumnExtensions.FilterDisplayType)}"/>

そして、もう1つ注意してください。プロパティが継承する理由がよくわかりません。私が見る限り、 DataGridTextColumn オブジェクトに明示的に設定するつもりです。

于 2012-04-05T08:14:50.303 に答える