在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" />
答案 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,嵌套在ItemsControl
中