我已成功地創建以下文件:
如果我理解正確的話,在這種情況下,你必須使用一個嵌套DataGrid
。這個效果可以通過DataGridTemplateColumn.CellTemplate -> your DataTemplate
來實現。此外,該模式應該是「正常」TextBlock
,所以它隱藏時嵌套DataGrid
顯示一些值。檢查將使用DataTemplate
中的DataTrigger
進行。
XAML代碼:
<DataGrid Name="SimpleDataGrid" AutoGenerateColumns="False" RowHeaderWidth="0" CanUserAddRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" Loaded="SimpleDataGrid_Loaded">
<DataGrid.Columns>
<DataGridTemplateColumn Width="1.5*" Header="HeaderWithDataGrid" IsReadOnly="False">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<!-- Nested DataGrid -->
<DataGrid Name="InsertedDataGrid" AutoGenerateColumns="False" RowHeaderWidth="0" Loaded="InsertedDataGrid_Loaded">
<DataGrid.Columns>
<DataGridTextColumn Header="InsertedHeader1" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" />
<DataGridTextColumn Header="InsertedHeader2" Width="1.5*" Binding="{Binding Age}" IsReadOnly="False" />
<DataGridTextColumn Header="InsertedHeader3" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" />
</DataGrid.Columns>
</DataGrid>
<!-- Simply value, if nested DataGrid will be Hidden -->
<TextBlock Name="SimpleValue" Text="{Binding Age}" Visibility="Hidden" />
</Grid>
<DataTemplate.Triggers>
<!-- It checks for Hidden NestedDataGrid -->
<DataTrigger Binding="{Binding ShowInsertedGrid}" Value="Hidden">
<Setter TargetName="InsertedDataGrid" Property="Visibility" Value="Collapsed" />
<Setter TargetName="SimpleValue" Property="Visibility" Value="Visible" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- Simply column -->
<DataGridTextColumn Header="SimpleHeader" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" />
</DataGrid.Columns>
</DataGrid>
Person類上市:
public class Person
{
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
// For clarity using string.
// In real project using a bool.
public string ShowInsertedGrid
{
get;
set;
}
}
兩個ObservableCollection
爲DataGrid的:
private ObservableCollection<Person> DataForDataGrid = new ObservableCollection<Person>();
private ObservableCollection<Person> DataForInsertedDataGrid = new ObservableCollection<Person>();
在處理Loaded
事件設置主DataGrid的數據:
private void SimpleDataGrid_Loaded(object sender, RoutedEventArgs e)
{
DataForDataGrid.Add(new Person()
{
Age = 2,
Name = "Nick",
ShowInsertedGrid = "Hidden", // Hidden NestedDataGrid
});
DataForDataGrid.Add(new Person()
{
Age = 1,
Name = "Sam",
});
DataForDataGrid.Add(new Person()
{
Name = "Kate",
Age = 15,
ShowInsertedGrid = "Hidden", // Hidden NestedDataGrid
});
SimpleDataGrid.ItemsSource = DataForDataGrid;
}
Loaded
事件處理程序NestedDataGrid:
private void InsertedDataGrid_Loaded(object sender, RoutedEventArgs e)
{
DataGrid MyDataGrid = sender as DataGrid;
DataForInsertedDataGrid.Add(new Person()
{
Name = "Bob",
Age = 15,
});
DataForInsertedDataGrid.Add(new Person()
{
Name = "SpanchBob",
Age = 151,
});
MyDataGrid.ItemsSource = DataForInsertedDataGrid;
}
對於美容和提高使用Styles
外觀。
編輯:
如果你希望你的嵌套DataGrid
是對整個行的話,我可以建議以下解決方案(而不是事實,這是最好的解決辦法,但我只能提供這種):
對於每個小區將使用DataTemplate中。因此SimpleHeader
轉化爲:
<DataGridTemplateColumn Width="1.5*" Header="SimpleHeader" IsReadOnly="False">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<!-- Nested DataGrid -->
<DataGrid Name="InsertedDataGrid2" AutoGenerateColumns="False" RowHeaderWidth="0" Loaded="InsertedDataGrid2_Loaded">
<DataGrid.Columns>
<DataGridTextColumn Header="InsertedHeader4" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" />
<DataGridTextColumn Header="InsertedHeader5" Width="1.5*" Binding="{Binding Age}" IsReadOnly="False" />
<DataGridTextColumn Header="InsertedHeader6" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" />
</DataGrid.Columns>
</DataGrid>
<!-- Simply value, if nested DataGrid will be Hidden -->
<TextBlock Name="SimpleValue" Text="{Binding Name}" Visibility="Hidden" />
</Grid>
<DataTemplate.Triggers>
<!-- It checks for Hidden NestedDataGrid -->
<DataTrigger Binding="{Binding ShowInsertedGrid}" Value="Hidden">
<Setter TargetName="InsertedDataGrid2" Property="Visibility" Value="Collapsed" />
<Setter TargetName="SimpleValue" Property="Visibility" Value="Visible" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
哪裏InsertedDataGrid2_Loaded
您設置的數據:
private void InsertedDataGrid2_Loaded(object sender, RoutedEventArgs e)
{
DataGrid MyDataGrid = sender as DataGrid;
DataForInsertedDataGrid2.Add(new Person()
{
Name = "Bob2",
Age = 215,
});
DataForInsertedDataGrid2.Add(new Person()
{
Name = "SpanchBob2",
Age = 251,
});
MyDataGrid.ItemsSource = DataForInsertedDataGrid2;
}
對於使用DataGrid
每一列,你爲它加載數據的代碼。因此,計算主要和嵌套DataGrid
的總列數。
它是否總是行(3)應該有標題和數據的第三行? – 8bitcat
不,它可以是任何行。 –