2010-06-23 2 views
4

런타임에 하위 요소를 완전히 제어 할 수있는 WPF 요소를 만들려고합니다. 속성이 변경 될 때 자식 UI를 추가하거나 제거합니다. 제 경우에는 하나의 자식 만 있지만 ItemsSource 속성을 수정할 때 ItemsControl이하는 것과 조금 비슷합니다.런타임에 자식을 동적으로 생성 (캡슐화)하는 WPF 요소

MVVM의보기 컨테이너입니다. 모델 또는 ViewModel을 지정하면 마술처럼 올바른보기가 만들어지고 모든 것이 연결됩니다. 뷰 컨테이너를 템플릿으로 만들 필요가 없습니다 (UserControls이며 자체 템플릿이있는 사용자 정의보기를 생성하므로). 가능한 한 캡슐화하는 것이 좋습니다. Grid와 같은 것을 내림으로써 내 속성을 변경할 때 하위 컨트롤을 추가하여 쉽게이 작업을 수행 할 수 있습니다. 그리드는 자식 요소 컬렉션을 공개하고 누구나 물건을 추가하고 제거 할 수 있습니다.

캡슐화를 최대화하기 위해 사용해야하는 WPF 클래스는 무엇이며 런타임에 하위 요소를 어떻게 추가합니까?

문서에 대한 이해를 바탕으로 런타임에 하위 컨트롤을 만들 수 있는지 확인하기 위해 FrameworkElement 및 AddVisualChild를 사용하여 보았습니다. 내가 "ViewContainer을 말하는 TextBlock을 볼 것으로 예상, 나는 창에 ViewContainer를 넣어

public class ViewContainer : FrameworkElement { 
    private TextBlock _child; 

    public ViewContainer() { 
     _child = new TextBlock { Text = "ViewContainer" }; 
     AddLogicalChild(_child); 
     AddVisualChild(_child); 
     InvalidateMeasure(); 
    } 

    public object Content { get; set; } 

    protected override Size ArrangeOverride(Size finalSize) { 
     _child.Arrange(new Rect(finalSize)); 
     return finalSize; 
    } 
    protected override Size MeasureOverride(Size availableSize) { 
     _child.Measure(availableSize); 
     return _child.DesiredSize; 
    } 
} 

,이 실행 : 나는 AddLogicalChild가 필요한지 여부에 분명 아니지만, 난 그냥 경우에 넣어 ". 하지만 대신 빈 창이 보입니다. 그래서 분명히 나는 ​​뭔가를 놓친다.

위의 코드를 수정하여 런타임에 "자식"컨트롤이 나타나지만 다른 사람이 혼란에 빠지지 않도록 할 수 있습니다 (피할 수있는 것 이상).

답변

6

특정 질문에 대답하려면 하위 요소를 표시 할 수 있도록 GetVisualChildVisualChildrenCount 속성을 재정의해야합니다.

+0

쿨 - 그랬어. AddVisualChild가 실제로 아무 것도 *에 추가하지 않으면 왜 AddVisualChild가 있는지 궁금해합니다. –

+1

아, 알겠습니다. 그것은 부모에 대해 알기 위해 어린이를 설정합니다. 그러나 많은 부모들은 아이들의 목록을 필요로하지 않을 것입니다 (아무도 없거나 하나만 가지고있는). 그래서 부모에게 저장의 선택과 책임을 남겨 둡니다. 공격적인 관심사 분리 : WPF에 대해 내가 좋아하는 것들 중 하나. 그러나 그것은 "AddVisualChild"라는 이름이 오해의 소지가 있음을 의미합니다. 이는 그것이 어떤 종류의리스트에 그것을 추가하고 있음을 암시하기 때문입니다. –

0

암시 적 DataTemplates에 대한 WPF의 지원을 이용하는 것에 대해 생각해 보셨습니까?

내가 당신과 비슷한 요구 사항을 처리 한 방식은 ContentControl을 사용하는 것입니다. Content 속성을 내 ViewModel에 바인딩합니다. 그런 다음 Content Dictionary에 트리의 어딘가에서 참조 된 Resource Dictionaries에 Content Property에 할당 할 수있는 ViewModels의 모든 유형에 대해 정의 된 DataTemplates가 있는지 확인합니다.

이 방법을 사용하면 WPF가 ViewModel의 올바른보기 위로 배선을 처리합니다.

+0

예, 이전에 해 보았습니다. 이번에는 한 걸음 더 나아가고 싶습니다. ViewContainer에서 모델을 가져 와서 자동으로 올바른 ViewModel을 찾아서 만들고 싶습니다. 거기에보기. 나는 DataTemplate.DataType이 도움없이 거기에 나를 데려 갈 것이라고 생각하지 않는다. –

+0

, DataTemplate.DataType은 적합하지 않지만 DataTemplateSelector가있을 수 있습니다. –