我需要生成 TabItem N 次,它们都需要看起来相同。Tabitem 包含一个 DataGrid,其中 ItemsSource 需要绑定到不同的 Items 上。
我尝试使用数据模板
<DataTemplate x:Key="tabItemContent">
<TabItem Name="MainTabItem" Header="Main">
<DataGrid CanUserSortColumns="True" RowDetailsVisibilityMode="Visible" AlternatingRowBackground="#E0E0E0" AlternationCount="2" CellStyle="{StaticResource BodyContentDataGridCentering }" Name="DgPrinters" AutoGenerateColumns="False" RowHeight="50">
<!--body content datagrid cell vertical centering-->
<DataGrid.Columns>
<DataGridTemplateColumn Header="Überwachen" Width="Auto" CellStyle="{StaticResource BodyContentDataGridCentering}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox HorizontalAlignment="Center" IsChecked="{Binding Monitor, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Width="Auto" Header="Druckername" Binding="{Binding FullName, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/>
<DataGridTextColumn Width="Auto" Header="Freigabename" Binding="{Binding ShareName, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/>
<DataGridTextColumn Header="Portname" Binding="{Binding PortName, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/>
<DataGridTextColumn Header="Treibername" Binding="{Binding DriverName, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Text="Anzahl Jobs: " FontWeight="Bold" />
<TextBlock Text="{Binding NumberOfJobs}" Grid.Column="1" />
<TextBlock Text="Status: " FontWeight="Bold" Grid.Row="1" Grid.Column="0"/>
<TextBlock Text="{Binding Status}" Grid.Row="1" Grid.Column="1" />
</Grid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</TabItem>
</DataTemplate>
所以我可以生成标签项,例如
TabItem mainItem = new TabItem();
mainItem.ContentTemplate = TryFindResource("tabItemContent") as DataTemplate;
MainTabControl.Items.Add(mainItem);
现在我的问题是我需要访问每个选项卡项的数据网格,以便我可以将DataGrid.ItemsSource
绑定到不同的ObservableCollections
。
我现在的问题是:是否可以以这种方式访问 DataGrid 并设置不同的源,或者我是否以错误的方式完成了整个事情,并且有更好的方法来实现所有这些?
在这种情况下,最好为整个 TabControl 使用 ViewModel,而 ViewControl 又将为每个 TabItem 提供 ObservableCollecion of VM,并且每个 TabItem VM 都有自己的 ItemsSource for DataGrid。下面是显示想法的代码:
public class TabControlViewModel : INotifyPropertyChanged
{
public ObservableCollection<TabItemViewModel> Tabs {get;set;}
public TabControlViewModel()
{
Tabs = new ObservableCollection<TabItem>();
Tabs.Add(new TabItem { ... });
}
}
public sealed class TabItemViewModel : INotifyPropertyChanged
{
public string Header { get; set; }
public ObservableCollection<DataGridRowVM> DataGridItemsSource {get;set;}
public TabControlViewModel()
{
DataGridItemsSource = new ObservableCollection<DataGridRowVM>();
DataGridItemsSource .Add(new DataGridRowVM{ ... });
}
}
public sealed class DataGridRowVM: INotifyPropertyChanged
{
public string PortName { get; set; }
public string DriverName{ get; set; }
.....
}
<TabControl ItemsSource="{Binding Tabs}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Header}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<DataGrid CanUserSortColumns="True" RowDetailsVisibilityMode="Visible" ItemsSource="{Binding DataGridItemsSource}>
<!-- Your template goes here-->
</DataGrid>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>