2010-05-07 4 views
1

저는 여러 화면을 처리해야하는 WPF 응용 프로그램 (이번에는이 두 개)에서 작업하고 있습니다.WPF : 다중보기, 하나의 DataContext

여러 화면에서 하나의보기를 열 수 있으며 모든 화면에서 사용자 작업을 일관되게 반영해야합니다.

주어진보기 유형에 대해 단일 DataContext가 인스턴스화됩니다. 그런 다음 화면에보기가 표시되면 고유 한 DataContext가 연결됩니다. 따라서 하나의 DataContext, 여러 뷰 (같은 유형의 뷰/xaml).

지금까지 그렇게 좋았습니다. 그것은 대부분의 경우에 아주 잘 작동합니다.

ItemsControl을 사용하는 특정보기에 문제가 있습니다. 이러한 ItemsControl은 ViewModel/DataContext (C# 코드)에서 동적으로 빌드하는 UIElements를 표시하는 데 사용됩니다. 이러한 UIElement는 대부분 Path 객체입니다. 예 : 여기

<ItemsControl ItemsSource="{Binding WindVectors}"> 
    <ItemsControl.Template> 
    <ControlTemplate TargetType="{x:Type ItemsControl}"> 
     <Canvas IsItemsHost="True" /> 
    </ControlTemplate> 
    </ItemsControl.Template> 
</ItemsControl> 

, WindVectorsObservableCollection<UIElement>이다.

보기를 처음 열면 모든 것이 정상입니다. 문제는보기가 다른 화면으로 열리면 모든 ItemsControl이 첫 번째 화면에서 제거되고 두 번째 화면이 표시된다는 것입니다. 이 뷰의 다른 WPF 구성 요소 (예 : TextBlock)는 정상적으로 반응하여 두 화면에 모두 표시됩니다.

도움을 주시면 감사하겠습니다.

감사합니다.

파브리스

답변

0

이것은 예상 된 동작 (즉, 윈폼부터 그런 식이었다 참조) - ObservableCollection에이 참조되기 때문입니다. 이것은 값 유형, 참조 유형에서만 발생합니다.

짧은 대답은 '하지 마라'입니다. xaml에서 컬렉션 뷰를 정의하거나 사용자 정의 데이터 공급자를 코딩하고 그 중 하나에 바인딩 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 참조 또는 ObservableCollection이 관련되어 있다고 생각하지 않습니다. 예를 들어 ListBox를 통해 참조 객체의 ObservableCollections에 바인딩 된 다른 그래픽 구성 요소가 있고 두 화면 모두에 표시됩니다. ItemsControl에 대한 내용이 더 많습니다. 그러나 이것에 대해서는 자세히 설명 할 수 없습니다. – zapho

+0

목록 상자는 항목을 가져 와서 ListItems를 생성합니다. 즉, ItemsControl처럼 직접 컬렉션의 항목을 사용하지 않습니다. ItemsControl (또는 유사한 컨트롤)을 대상 컨트롤이 해당 컬렉션에 보유하고있는 컬렉션에 바인딩하면 해당 컬렉션이 다른 컨트롤에 바인딩되어 현재 컨트롤에서 벗어나 데이터가 손실됩니다. 목록을 복제하거나 collectionview를 조사해야합니다. –

관련 문제