如何重用稍微不同的DataTemplate元素?

时间:2017-11-24 10:40:00

标签: c# wpf xaml datatemplate wpfgrid

在WPF中,我定义了一个元素网格。它们将显示或折叠,具体取决于ViewModel中数组中对象的属性。

在XAML文件中,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" />

1 个答案:

答案 0 :(得分:0)

创建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>

在您View中使用ItemsControl(如 dymanoid 表示)

<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>

有关ItemsControl的更多信息,您会发现很多可以帮助您的更多信息

看一下这个例子,这里所有的itens都是一个usercontrol,图像中的所有项都是相互独立的,并且都是同一个usercontrol,嵌套在ItemsControlenter image description here