2012-06-15 3 views
5

다른 자체 정의보기를 표시하는 WPF 창이 있습니다. 지금까지 MVVM에 관해 배운 모든 것을 사용할 수있었습니다.여러보기를 여러보기 모델에 바인딩

이제 새로운 "문제"가 생겼습니다. 동일한보기의 10 개 항목을 더 크게 볼 수 있습니다. 이 10 개의 뷰 엔티티는 일련의 컨트롤 (텍스트 상자, 콤보 상자 등)을 포함하지만 모두 일관성이 있습니다.

그렇다면이 뷰를 ViewModel에 어떻게 바인딩합니까?

"상위 레벨"ViewModel에서 ViewModel의 인스턴스가 10 개 있다고 생각하고 뷰에 VM의 인스턴스를 datacontext로 수정 정의했습니다.

내 질문보기 -> 여러 (동일한)보기를 자신의보기 모델에 바인딩하는 것이 더 쉽거나 (더 convienient 한) 방법이 있습니까?

코드 - 예 :

보기 모델 :

private PanelViewModel _panelViewModel1 = new PanelViewModel(); 
public PanelViewModel PanelVM1 
{ 
    get { return _panelViewModel1; } 
} 

보기 - 예 :

<myControls:vwPanel HorizontalAlignment="Left" x:Name="vwPanel1" 
        VerticalAlignment="Top" DataContext="{Binding Path=PanelVM1}"/> 

날 귀찮게 무슨 내가 열 전망이 논리 10 번을해야한다는 것입니다 ?

UPDATE : 몇 가지 질문에 대답하려면 : 내가 UserControl에서 상속하여 내 자신의 뷰를 정의 하나 개의보기를 (내 예) 10 배를 보여주고 싶어요. 따라서 vwPanelUserControl에서 상속됩니다. 10 개의 vwPanel은 Grid 안의 StackPanel 안에 배치됩니다.

데이터를 표시하는 것이 아니기 때문에 목록보기 또는 데이터 격자를 시작하는 것이 좋습니다./

UPDATE2 : 내가 바라는 것은 ViewModels 목록을 정의하고 내 10 개의 뷰를이 목록 중 하나에 바인딩하는 것과 같습니다. 그러나 이것은 효과가 없을 것입니까? 적어도 나는 XAML 중에서 목록에있는 하나의 "특별한"entitiy을 참조하는 방법을 모르겠다. ...

+1

큰보기의 열 개의보기가 특별히 정의되어 있습니까? 즉, List를 만들고 해당 List를 IEnumerable의 ViewModel에 바인드하여 표시 할 수없는 이유가 무엇입니까? – Tim

+0

@Tim 올바른 순서로 출력하고 출력하려면 올바른 순서로 입력해야합니다. 특수하게 정의하지 않아도 가능합니까? – basti

답변

8

일반적으로 Views에서 ViewModels으로 매핑 할 때 내재적 인 DataTemplates을 사용합니다.<TabControl.Resources>

<DataTemplate DataType="{x:Type local:PanelViewModel}"> 
    <myControls:vwPanel /> 
</DataTemplate> 

이 언제 WPF 유형 PanelViewModel의 VisualTree의 개체가 발생한다는 것을 의미 단지 등 그들은 <Window.Resources> 또는 특정 요소 아래에서, <Application.Resources>에 갈 수 있습니다, 그것은 vwPanel

객체를 사용하여 그릴 것 일반적 ItemsSource 속성

<ItemsControl ItemsSource="{Binding CollectionOfAllPanels}" /> 

통해 또는 이용하여 VisualTree에 배치 취득 a ContentControl

<ContentControl Content="{Binding PanelVM1}" /> 
+0

그러나 나는 아직도 이들을 "식별"할 수 있습니까? MVVM에서는 V-> VM-> M이라는 순서를가집니다. 내 견해가 귀하의 솔루션을 사용하여 올바른 VM을 알고 있습니까? 특히 VM의 속성이 더 높은 수준의 VM에 의해 변경되는 경우? – basti

+0

@chiffre, itemsControl에서 VM이 표시되는 순서는 ItemsSource 컬렉션에 추가 된 순서와 동일합니다. 따라서 Rachel의 예를 사용하면 "패널"에 3 개의 뷰 모델을 추가하면 추가 한 순서대로 표시됩니다. 첫 번째 속성을 선택하고 속성을 변경하면 패널의 인덱스 0에있는보기 모델에 해당 속성이 변경됩니다. VM이 다른 VM을 변경하는 시점을 알려주는 경우 VM이 INotifyPropertyChanged를 올바르게 구현하는 한 괜찮습니다. – Thelonias

+0

@chiffre 나는 당신의 질문을 100 % 확신 할 수 없다. 필자가 알고있는 바로는, 여러분의 VM은 똑같은'Panel' UserControl을 사용하여 표시하고자하는 10 개의'PanelViewModel' 속성들을 포함하고 있습니다. VM에 패널이 나열되는 방법에 따라'ItemsControl' (ObservableCollection에 저장된 경우) 또는 'ContentControl'(10 개의 별도 속성에 저장되는 경우)과 같은 것을 사용하여 표시 할 수 있습니다. . 'PanelUserControl'의 뒤에있는'DataContext'는 바인딩 된 'PanelViewModel'이 될 것입니다. 그렇기 때문에 그들은 부모 VM에 의해 업데이트 될 때 정확한 데이터를 표시합니다 – Rachel

1

나는 당신의 질문을 정확하게 이해할 수있다. 즉, 하나의 뷰를 정의하고 X 횟수만큼 표시하려는 여러 뷰 모델이 있습니다. 귀하의 예는 "PanelViewModel"에 대한보기로 패널을 사용하는 것을 보여줍니다 ... vwPanel에 대한 상위 항목의 컨트롤은 무엇입니까? ListBox와 같은 것을 사용한다고 가정하면 vwPanel을 포함하는 사용자 정의 DataTemplate을 정의하고 DataTemplate을 ListBox.ItemTemplate에 할당 할 수 있습니다. 예를 들어

는 :

<Window.Resources> 
    <DataTemplate x:Key="myVMTemplate" TargetType="{x:Type myViewModels:PanelViewModel}"> 
     <myControls:vwPanel HorizontalAlignment="Left" VerticalAlignment="Top"/> 
    </DataTemplate> 
</Window.Resources> 

<ListBox ItemsSource="{Binding Path=MyCollectionOfPanelVMs}" 
     ItemTemplate="{StaticResource myVMTemplate}" /> 

나는이 작동하는지 확인하지 않았습니다.

관련 문제