[英]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.