2010-04-25 5 views
2

datatemplate을 통해 데이터를 표시하는 부모 contentcontrol이 있습니다. 데이터 템플릿에는 동일한 유형의 여러 사용자 콘솔이 포함 된 스택 패널이 포함되어 있습니다. 부모 컨트롤에 한 번만 속성을 설정하고 싶습니다. 모든 하위 컨트롤의 속성 값을 설정해야합니다. 그러나 stackpanel에서 그것을 할 수있는 방법이 있다면 그것은 또한 괜찮습니다. 런타임에 템플릿을 변경할 수 있으며 값을 새 템플릿에 전파해야합니다.WPF, 여러 하위 컨트롤에 단일 값으로 속성 설정

현재 해결책은 부모와 하위 컨트롤 모두에 속성을 구현하고 코드를 사용하여 부모에서 모든 하위 컨트롤로 값을 전파하는 것입니다. 내 질문은 : 더 좋은 방법이나 다른 방법이 있습니까?

편집 : 내 질문에 대한 명확한 메모. 응용 프로그램은 현재 WPF이지만 silverlight로 이식 할 수 있다면 보너스가됩니다. 속성은 Style 유형의 종속성입니다.

하위 컨트롤의 스타일 부분에 사용하고 싶습니다. 현재 데이터 템플릿은 별도의 리소스 사전에 저장되어 있으므로 재사용 할 수 있습니다. 서브 컨트롤의 비주얼은 controltemplate을 통해 스타일링됩니다. 템플릿에는 세 가지 컨트롤이 포함되어 있으며 첫 번째 컨트롤에는 레이블이 있습니다. 필요 (바보 같은 소망)는 스타일을 한 번만 설정하여 데이터 템플릿의 모든 하위 컨트롤에 일관된 모양과 느낌을주는 것입니다. 그래서 문제의 핵심은 컨테이너 컨트롤의 리소스 딕셔너리에 저장된 하위 컨트롤의 스타일 종속성 속성 값을 무시하는 것입니다. 둘 다 사용자 정의 사용자 컨트롤이므로 모든 옵션이 열려 있습니다.

<Parent SubSubStyle="x" Template="template" /> 

<DataTemplate x:Key=template> 
    <StackPanel> 
    <Subcontrol SubSubStyle="?"/> 
    <Subcontrol SubSubStyle="?"/> 
    <Subcontrol SubSubStyle="?"/> 
    <Subcontrol SubSubStyle="?"/> 
    </StackPanel> 
</DataTemplate> 
+0

WPF와 Silverlight 솔루션 또는 Silverlight 만 필요합니까? – AnthonyWJones

+0

현재 WPF 만 있지만 WPF와 Silverlight에서 모두 작동하는 것이 좋습니다. –

답변

1

당신이 작성한 DependencyProperty를 설정하려는 속성입니다 옵션 최고? 그렇다면 WPF에서 수행해야 할 이상적인 작업은 시각적 트리의 요소별로 inherited이 될 속성을 정의하는 것입니다.

자신의 종속성 속성이 아닌 경우 (또는이 메커니즘을 지원하지 않는 Silverlight를 사용하는 경우) implicit styles을 사용해야합니다.

public class MyControl { 

    // be prepared for some dependency property hell below 
    // this defines a DependencyProperty whose value will be inherited 
    // by child elements in the visual tree that do not override 
    // the value. An example of such a property is the FontFamily 
    // property. You can set it on a parent element and it will be 
    // inherited by child elements that do not override it. 

    public static readonly DependencyProperty MyInheritedProperty = 
     DependencyProperty.Register(
      "MyInherited", 
      typeof(string), 
      typeof(MyControl), 
      new FrameworkPropertyMetadata(
       null, 
       FrameworkPropertyMetadataOptions.Inherits 
      ) 
     ); 

} 
+0

작동하지만 상속을 제대로 작동 시키려면 RegisterAttached()를 사용해야합니다. 하위 컨트롤에는 AddOwner() + inerits 옵션이 필요합니다. 답장을 보내 주셔서 감사합니다. –

+0

흠, 어쩌면 기억하기 전에 그걸로 실행합니다. 관련없는 클래스에서 연결된 속성을 만든 다음 부모 컨트롤과 자식 컨트롤에서 AddOwner를 사용하여 작업하는 것을 기억합니다. 그런 식으로 작업 할 때 첨부 된 속성 구문을 사용할 필요가 없었습니다. – Josh

관련 문제