2010-01-02 2 views
1

ItemsControl (하위 클래스를 EnhancedItemsControl이라고 함)을 서브 클래 싱하는 중입니다. ScrollViewerTemplate 종속성 속성을 표시하여 사용자가 사용하는 ScrollViewer에 대한 자체 템플릿을 선택적으로 지정할 수있게하고 싶습니다. 나는 이런 식으로 일을하고있다 :WPF : 템플릿 유형의 종속성 속성 - 기본 템플릿을 가져올 위치 (기본값으로 설정)?

내 EnhancedItemsControl 내 기본 스타일에서
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 

, 나는 다음과 같이에서 ScrollViewer를 포함

<ScrollViewer 
    Template="{TemplateBinding ScrollViewerTemplate}" 
    ... 
> 
    <ItemsPresenter 
    ... 
    /> 
</ScrollViewer> 

이것은 사용자가 ScrollViewerTemplate를 지정하면 작동하지만 그가 떠날 때 기본값으로 ScrollViewer가 표시되지 않습니다 (아마도 템플릿이 비어 있기 때문일 것입니다). WPF에게 어떻게 알릴 수 있습니까 템플릿이 null이 아닌 경우에만 사용하십시오. 그렇지 않으면 기본값을 사용하십시오? (그것은 내가 null이 아닌 경우에만 템플릿을 설정하기 위해 트리거를 사용할 수 있었지만 각 컨트롤의 모든 사용자 정의 속성에 대한 트리거를 가지고 있다는 아이디어가 마음에 들지 않았습니다 ...)

스타일에도 비슷한 문제가 있습니다. 사용자가 ScrollViewer 스타일을 지정하도록하고 싶지만 사용자가 지정하지 않으면 ScrollViewerStyle의 값이 null이됩니다 (<ScrollViewer Style="{x:Null}" />). 그러면 기본 스타일이 적용되지 않습니다.

해결 방법? 고맙습니다!

답변

1

, 당신은 당신의 UIPropertyMetadata에 지정되는 기본 값은 실제로 null입니다.

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

대신 ScrollViewerTemplate 속성을 정의하는하는 ScrollViewerStyle 속성을 정의 실제로는 현재 테마에서 정의한대로 ScrollViewer 스타일을 기본값으로 사용합니다.

+0

감사합니다. 당신은 그 사람입니다! 나는 타입에 의해 인덱싱 된 리소스 딕셔너리로부터 기본 스타일을 얻을 수 있다는 것을 알지 못했다. 꽤 직관적이지 않다. 나를 보여 주셔서 다시 한번 감사 드리며, null이 아닐 때 스타일/템플릿에 트리거를 할당하는 것보다 훨씬 낫다. –

+1

그 밖의 모든 것이 불확실하지만, 한 가지는 확실합니다. 나는 그 사람입니다. :) –

1

TemplateBinding을 사용하는 대신 TemplatedParent의 RelativeSource로 바인딩을 사용할 수 있습니다. 이 방법으로 바인더에서 변환기를 사용할 수 있습니다. 이제 Binding에 대한 Converter (IValueConverter)를 선언하고 ScrollViewerTemplate 속성이 null 인 동안 기본 Template을 반환합니다. 그것은 기본적으로 그뿐만 아니라 새로운 ScrollViewer에 널 (null)이기 때문에 당신은 모두에게 권리를 제외하고 하나 개 조금하고있는

More Information

+0

감사합니다. 일반 바인딩으로 TemplateBinding을 대체 할 수 있는지 알고 있지만 Aviad의 게시물이 없으면 템플릿의 기본값을 가져 오는 방법을 알지 못합니다. –