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}"/>