数据模板 - 选项卡项 - 数据网格的访问控制



我需要生成 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>

最新更新