ItemsControlをサブクラス化して(EnhancedItemsControlと呼びましょう)、ScrollViewerTemplate依存関係プロパティを公開します。これにより、ユーザーは、使用するScrollViewerの独自のテンプレートをオプションで指定できます。私はこのようにやっています:
public ControlTemplate ScrollViewerTemplate
{
get { return (ControlTemplate)GetValue(ScrollViewerTemplateProperty); }
set { SetValue(ScrollViewerTemplateProperty, value); }
}
public static readonly DependencyProperty ScrollViewerTemplateProperty =
DependencyProperty.Register(
"ScrollViewerTemplate",
typeof(ControlTemplate),
typeof(EnhancedItemsControl),
new UIPropertyMetadata(new ScrollViewer().GetValue(ScrollViewer.TemplateProperty))); //This doesn't work for me
EnhancedItemsControlのデフォルトのスタイルでは、次のようにScrollViewerを含めます。
<ScrollViewer
Template="{TemplateBinding ScrollViewerTemplate}"
...
>
<ItemsPresenter
...
/>
</ScrollViewer>
これは、ユーザーがScrollViewerTemplateを指定した場合に機能しますが、デフォルト値のままにすると、ScrollViewerは表示されません(おそらく、テンプレートが空であるため)。テンプレートをnull以外の場合にのみ使用し、それ以外の場合はデフォルトのテンプレートを使用するようにWPFに指示するにはどうすればよいですか?(テンプレートがnullでない場合にのみ、トリガーを使用してテンプレートを設定できることに気付きましたが、各コントロールのすべてのカスタムプロパティにトリガーを設定するというアイデアは好きではありません...)
スタイルにも同様の問題があります。ユーザーにScrollViewerスタイルを指定させたいが、ユーザーが指定しなかった場合、ScrollViewerStyleの値はnull(に等しい<ScrollViewer Style="{x:Null}" />
)になり、デフォルトのスタイルが適用されなくなります。
これを解決する方法は?ありがとうございました!