我有3个数据网格共享相同的数据类型.我想配置一次列绑定并让3个datagrids共享资源.
例如
<DataGrid Grid.Row="1" x:Name="primaryDG" ItemsSource="{Binding Path=dgSource AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Width="Auto" Header="Column 1" Binding="{Binding Path=Col1}"/>
<DataGridTextColumn Width="Auto" Header="Column 2" Binding="{Binding Path=Col2}"/>
<DataGridTextColumn Width="Auto" Header="Column 3" Binding="{Binding Path=Col3}"/>
<DataGridTextColumn Width="Auto" Header="Column 4" Binding="{Binding Path=Col4}"/>
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
有没有办法为每个DataGrid设置ItemsSource,然后使用datatemplate或controltemplate来获取列?
是的......两种方式.你可以简单地添加一个样式来DataGrid
设置这样的列......
<Style x:Key="MyColumnDefsStyle" x:Shared="True" TargetType="DataGrid">
<Setter Property="Columns">
<Setter.Value>
<DataGridTextColumn Width="Auto" Header="Column 1" Binding="{Binding Path=Col1}"/>
<DataGridTextColumn Width="Auto" Header="Column 2" Binding="{Binding Path=Col2}"/>
<DataGridTextColumn Width="Auto" Header="Column 3" Binding="{Binding Path=Col3}"/>
<DataGridTextColumn Width="Auto" Header="Column 4" Binding="{Binding Path=Col4}"/>
</Setter.Value>
</Setter>
</Style>
<DataGrid Style="{StaticResource MyColumnDefsStyle}" ItemsSource="{Binding Foo1}" />
<DataGrid Style="{StaticResource MyColumnDefsStyle}" ItemsSource="{Binding Foo2}" />
<DataGrid Style="{StaticResource MyColumnDefsStyle}" ItemsSource="{Binding Foo3}" />
Run Code Online (Sandbox Code Playgroud)
如果您将它应用于自己可能已经使用样式的多个网格,那么这可以解决问题.
在这种情况下,另一种更灵活的方式更好.然而,这需要创建一个XAML友好的类来表示一个ObservableCollection<DataGridColumn>
(虽然你在技术上只说列,我喜欢自己完成所以我也会为行做一个)然后将它们添加到你可以在XAML命名空间中引用的地方.(我称之为xmlns:dge
'DataGridEnhancements')然后你就像这样使用它:
在代码somwhere(我可以在应用程序范围内访问它)...
public class DataGridRowsCollection : ObservableCollection<DataGridRow>{}
public class DataGridColumnsCollection : ObservableCollection<DataGridColumn>{}
Run Code Online (Sandbox Code Playgroud)
然后在资源......
<dge:DataGridColumnsCollection x:Key="MyColumnDefs" x:Shared="True">
<DataGridTextColumn Width="Auto" Header="Column 1" Binding="{Binding Path=Col1}"/>
<DataGridTextColumn Width="Auto" Header="Column 2" Binding="{Binding Path=Col2}"/>
<DataGridTextColumn Width="Auto" Header="Column 3" Binding="{Binding Path=Col3}"/>
<DataGridTextColumn Width="Auto" Header="Column 4" Binding="{Binding Path=Col4}"/>
</dge:DataGridColumnsCollection>
Run Code Online (Sandbox Code Playgroud)
最后在XAML ......
<DataGrid Columns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo1}" />
<DataGrid Columns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo2}" />
<DataGrid Columns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo3}" />
Run Code Online (Sandbox Code Playgroud)
HTH,
标记
编辑:
由于您无法设置DataGrid.Columns
属性,您需要增强您的DataGridView
(如评论中所述).这是一个代码EnhancedDataGrid
:
public class EnhancedDataGrid : DataGrid
{
//the dependency property for 'setting' our columns
public static DependencyProperty SetColumnsProperty = DependencyProperty.Register(
"SetColumns",
typeof (ObservableCollection<DataGridColumn>),
typeof (EnhancedDataGrid),
new FrameworkPropertyMetadata
{
DefaultValue = new ObservableCollection<DataGridColumn>(),
PropertyChangedCallback = EnhancedDataGrid.SetColumnsChanged,
AffectsRender = true,
AffectsMeasure = true,
AffectsParentMeasure = true,
IsAnimationProhibited = true,
DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
});
//callback to reset the columns when our dependency property changes
private static void SetColumnsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var datagrid = (DataGrid) d;
datagrid.Columns.Clear();
foreach (var column in (ObservableCollection<DataGridColumn>)e.NewValue)
{
datagrid.Columns.Add(column);
}
}
//The dependency property wrapper (so that you can consume it inside your xaml)
public ObservableCollection<DataGridColumn> SetColumns
{
get { return (ObservableCollection<DataGridColumn>) this.GetValue(EnhancedDataGrid.SetColumnsProperty); }
set { this.SetValue(EnhancedDataGrid.SetColumnsProperty, value); }
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用CustomControl中创建的SetColumns依赖项属性设置列:
<custom:EnhancedDataGrid SetColumns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo1}" />
<custom:EnhancedDataGrid SetColumns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo2}" />
<custom:EnhancedDataGrid SetColumns="{StaticResource MyColumnDefs}" ItemsSource="{Binding Foo3}" />
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1983 次 |
最近记录: |