2010-01-02 72 views
1

我是一个ItemsControl的子类(我们称之为EnhancedItemsControl),并且我想公开ScrollViewerTemplate依赖属性,这将允许用户为ScrollViewer使用可选的指定自己的模板。我这样做是这样的:WPF:依赖属性和模板类型 - 在哪里获得默认模板(设置为默认值)?

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不显示(可能是因为它的模板是空的)。我怎样才能告诉WPF 只有当模板非空时才使用模板,否则使用默认模板? (它发生在我身上,我可以使用触发器来设置模板,只有当它不为空时,但我不喜欢触发每个控件中的每个自定义属性的想法......)

样式有类似的问题 - 如果我想让用户指定ScrollViewer样式,但用户没有指定它,ScrollViewerStyle的值将为null(等于<ScrollViewer Style="{x:Null}" />),这将停止应用默认样式!

如何解决这个问题?谢谢!

回答

1

你做的一切权利,除了一个点点,你指定你UIPropertyMetadata的默认值实际上是空的,因为它在新ScrollViewer是空以及默认。

而不是定义一个ScrollViewerTemplate属性,定义ScrollViewerStyle属性:

public Style ScrollViewerStyle 
{ 
    get { return (Style)GetValue(ScrollViewerTemplateProperty); } 
    set { SetValue(ScrollViewerTemplateProperty, value); } 
} 

public static readonly DependencyProperty ScrollViewerTemplateProperty = 
    DependencyProperty.Register(
     "ScrollViewerStyle", 
     typeof(Style), 
     typeof(EnhancedItemsControl), 
     new UIPropertyMetadata(null)); 

而且在控制你的默认样式,指定风格的默认值是这样的:

<Setter Property="ScrollViewerStyle" Value="{StaticResource {x:Type ScrollViewer}}"/> 

这实际上将默认为当前主题定义的ScrollViewer样式。

+0

谢谢你,你是男人!我不知道我可以从类型索引的资源字典中获取默认样式,这非常不直观 - 再次感谢我的演示,这比在触发器样式/模板不为null时更好。 – 2010-01-03 11:29:10

+1

虽然一切都不确定,但有一点可以肯定,我是男人:) – 2010-01-03 12:01:51

1

而不是使用TemplateBinding,您可以使用与TemplatedParent的RelativeSource绑定。这样你就可以在你的绑定中使用转换器。现在为你的Binding声明一个Converter(IValueConverter),并在ScrollViewerTemplate属性为null时返回默认的Template。

More Information

+0

谢谢,我知道用普通绑定替换TemplateBinding的可能性,但没有Aviad的帖子,我仍然不知道如何获得Template的默认值。 – 2010-01-03 11:23:38