簡體   English   中英

DataTemplate的訪問控制-TabItem-DataGrid

[英]Access Control of DataTemplate - TabItem - DataGrid

我需要生成N次TabItem,它們都需要看起來相同。 Tabitem包含一個DataGrid,其中ItemsSource需要綁定到不同的Items上。

我試圖使用DataTemplate

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

所以我可以生成TabItems

TabItem mainItem = new TabItem();
mainItem.ContentTemplate = TryFindResource("tabItemContent") as DataTemplate;
MainTabControl.Items.Add(mainItem);

現在我的問題是我需要訪問每個TabItem的DataGrid,因此可以將DataGrid.ItemsSource綁定到不同的ObservableCollections

我現在的問題是:是否可以通過這種方式訪問​​DataGrid並設置不同的Sources,還是我以錯誤的方式來做整個事情,並且有更好的方法來實現所有這些?

在這種情況下,最好為整個TabControl使用ViewModel,然后為每個TabItem使用VM的ObservableCollecion,並且每個TabItem VM將為DataGrid擁有自己的ItemsSource。 下面是顯示此想法的代碼:

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM