2017-11-24 13 views
0

WPF에서는 요소 격자를 정의했습니다. 그들은 ViewModel의 배열에있는 객체의 속성에 따라 표시되거나 축소됩니다. XAML 파일에서 약간 다른 DataTemplate 요소를 재사용하는 방법은 무엇입니까?

DataTemplate은 다음과 같습니다

<DataTemplate DataType="{x:Type implementationInputDevices:InputDevicesViewModel}"> 
    <Grid Grid.Row="1" Grid.Column="0"> 
     ... 

     <TextBlock Grid.Row="1" 
        Grid.Column="0" 
        Text="{Binding MyArray[0].Name}" 
        Visibility="{Binding MyArray[0].Visible}"/> 
     <ComboBox Grid.Row="1" 
        Grid.Column="1" 
        Visibility="{Binding MyArray[0].Visible}" 
        SelectedItem="{Binding MyArray[0].Foo}" 
        ItemsSource="{Binding Bar}"/> 

     <TextBlock Grid.Row="2" 
        Grid.Column="0" 
        Text="{Binding MyArray[1].Name}" 
        Visibility="{Binding MyArray[1].Visible}"/> 
     <ComboBox Grid.Row="2" 
        Grid.Column="1" 
        Visibility="{Binding MyArray[1].Visible}" 
        SelectedItem="{Binding MyArray[1].Foo}" 
        ItemsSource="{Binding Bar}"/> 
     ... 

     <TextBlock Grid.Row="n" 
        Grid.Column="0" 
        Text="{Binding MyArray[n-1].Name}" 
        Visibility="{Binding MyArray[n-1].Visible}"/> 
     <ComboBox Grid.Row="n" 
        Grid.Column="1" 
        Visibility="{Binding MyArray[n-1].Visible}" 
        SelectedItem="{Binding MyArray[n-1].Foo}" 
        ItemsSource="{Binding Bar}"/> 
    </Grid> 
</DataTemplate> 

당신이 볼 수 있듯이, 나는 모든 행 요소의 동일한 블록을 사용하지만, 약간 다른 값으로하고있다. 새 행을 추가하려면 수동 조정이 필요하고 위의 행을 추가하는 것이 (이 그리드 내부에) 훨씬 더 필요하므로 이는 매우 불편합니다.

요소 집합을 한 번 정의한 다음 간단한 명령으로 다시 사용할 수 있습니까? 이런 식으로 뭔가 :

<MyRowElement n="1" /> 
<MyRowElement n="2" /> 
... 
<MyRowElement n="k" /> 
+0

에 중첩 같은 UserControl을,이다 예를 봐 관찰 가능한 수집? MyArray [index] .property에 바인딩하는 대신, 각 항목이 텍스트 블록과 콤보 박스로 구성되도록 지정하는 목록 상자와 같은 컨트롤에 바인딩되는 관찰 가능한 개체 컬렉션을 만듭니다. 데이터 템플릿 선택기로 원하는 것을 얻을 수 있지만 솔직히이 접근법은 나에게 매우 못생긴다 –

+0

질문 제목에서 강제 태그를 제거했습니다. 왜 [여기] (https://stackoverflow.com/help/tagging)를 읽어 보시기 바랍니다. – dymanoid

+1

하드 코드 된 격자 대신 'ItemsControl'을 사용해야합니다. 'ItemsPanel'으로'Grid'를 사용할 수 있습니다. [이 질문] (https://stackoverflow.com/questions/16559186/wpf-sharedgridsize-group-with-itemscontrol-embedded-grids)으로 시작하십시오. – dymanoid

답변

0

ItemsControl에 대한 자세한 내용은 검색에 대한 UserControl

<UserControl x:Class=.......UcMyUserControl > 
    <Grid > 
     ......... <!-- RowDefinition, ColDefinition ... --> 
     <TextBlock Grid.Row="1" 
        Grid.Column="0" 
        Text="{Binding Name}" 
        Visibility="{Binding VisibleProperty}"/> 
     <ComboBox Grid.Row="1" 
        Grid.Column="1" 
        Visibility="{Binding VisibleProperty}" 
        SelectedItem="{Binding Foo}" 
        ItemsSource="{Binding Bar}"/> 
    </Grid> 
</UserControl> 

그리고 ( 말했듯이 가 dymanoid)는이 ItemsControl 당신의 View 사용

<ItemsControl x:Name="itmWrapPanel" 
      ItemsSource="{Binding MyArray, UpdateSourceTrigger=PropertyChanged}" 
      ScrollViewer.CanContentScroll="True" 
      ScrollViewer.VerticalScrollBarVisibility="Auto" 
      ScrollViewer.HorizontalScrollBarVisibility="Auto" 
      > 

    <!-- Panel Type --> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <!-- StackPanel || WrapPanel --> 
      <WrapPanel Orientation="Horizontal" 
        Background="White" 
        AllowDrop="True" 
        Width="{Binding ActualWidth, ElementName=itmWrapPanel}" 
        Height="{Binding ActualHeight, ElementName=itmWrapPanel}" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <!-- ItemTemplate/Your Template --> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate > 
      <local:UcMyUserControl /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

만들기, 당신 당신을 도울 수있는 많은 것을 발견 할 것입니다.

모두 여기에 itens UserControl을하고, 이미지의 모든 항목은 서로 독립적이며, 모두가 내가 당신에게 당신은 왜 단순히를 사용하지 않을 수 ItemsControl enter image description here