WPF DataTemplate 和列定义
WPF DataTemplate and columns definition
我需要改进网格的渲染。我有一个模板:
<DataTemplate x:Key="ubitTemplateService" DataType="{x:Type data:uBit}">
<Grid HorizontalAlignment="Stretch" x:Name="grdBit">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="MAMC" />
<ColumnDefinition Width="Auto" SharedSizeGroup="ID" />
<ColumnDefinition Width="Auto" SharedSizeGroup="lblVIS" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="{Binding FIELD_Mac, Mode=OneWay}" Style="{StaticResource labelStyle1}" />
<TextBlock Grid.Column="1" Text="{Binding Name}" Style="{StaticResource txtBlockStyle2}" />
<Label Grid.Column="1" Content="{Binding Show.Caption}" Style="{StaticResource labelStyle4}" />
</Grid>
</DataTemplate>
基本上我的 collection 的每条记录都会渲染一个网格,但由于我有 300 条或更多记录,整个渲染大约需要 2-3 秒(每个模板都渲染到一个列表框中)
我想更改布局并使用数据网格,如下所示:
<DataGrid x:Name="gridDati" BorderBrush="#abadb3" CanUserSortColumns="true" Margin="8,7,5,8">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name" CellTemplateSelector="{StaticResource DataTemplateSelector}" />
</DataGrid.Columns>
</DataGrid>
我想使用数据模板来呈现列,这可能会根据我的数据类型而改变。模板选择器是:
<local:DataconfigTemplateSelector ubitTemplateAv="{StaticResource ubitTemplateAv}" x:Key="DataTemplateSelector" />
问题是我想将 DataGrid 列的定义放入我的数据模板中,例如 DataGridTextColumn:
<DataTemplate x:Key="ubitTemplateAv">
<StackPanel>
...
</StackPanel>
</DataTemplate>
如何将列定义放入我的数据模板?
<DataGridTextColumn Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Header="Nome" Foreground="Black" IsReadOnly="True" x:Name="colName">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Padding" Value="4,7,4,6" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding SurName, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Header="SurName" Foreground="Black" IsReadOnly="True" x:Name="colSurName">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Padding" Value="4,7,4,6" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
关键是使用 DataGridTemplateColumn
而不是 DataGridTextColumn
。
那么你可以这样做:
<DataGridTemplateColumn
Width="80">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Foo}" Padding="4,7,4,6"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我需要改进网格的渲染。我有一个模板:
<DataTemplate x:Key="ubitTemplateService" DataType="{x:Type data:uBit}">
<Grid HorizontalAlignment="Stretch" x:Name="grdBit">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="MAMC" />
<ColumnDefinition Width="Auto" SharedSizeGroup="ID" />
<ColumnDefinition Width="Auto" SharedSizeGroup="lblVIS" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="{Binding FIELD_Mac, Mode=OneWay}" Style="{StaticResource labelStyle1}" />
<TextBlock Grid.Column="1" Text="{Binding Name}" Style="{StaticResource txtBlockStyle2}" />
<Label Grid.Column="1" Content="{Binding Show.Caption}" Style="{StaticResource labelStyle4}" />
</Grid>
</DataTemplate>
基本上我的 collection 的每条记录都会渲染一个网格,但由于我有 300 条或更多记录,整个渲染大约需要 2-3 秒(每个模板都渲染到一个列表框中) 我想更改布局并使用数据网格,如下所示:
<DataGrid x:Name="gridDati" BorderBrush="#abadb3" CanUserSortColumns="true" Margin="8,7,5,8">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name" CellTemplateSelector="{StaticResource DataTemplateSelector}" />
</DataGrid.Columns>
</DataGrid>
我想使用数据模板来呈现列,这可能会根据我的数据类型而改变。模板选择器是:
<local:DataconfigTemplateSelector ubitTemplateAv="{StaticResource ubitTemplateAv}" x:Key="DataTemplateSelector" />
问题是我想将 DataGrid 列的定义放入我的数据模板中,例如 DataGridTextColumn:
<DataTemplate x:Key="ubitTemplateAv">
<StackPanel>
...
</StackPanel>
</DataTemplate>
如何将列定义放入我的数据模板?
<DataGridTextColumn Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Header="Nome" Foreground="Black" IsReadOnly="True" x:Name="colName">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Padding" Value="4,7,4,6" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding SurName, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Header="SurName" Foreground="Black" IsReadOnly="True" x:Name="colSurName">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Padding" Value="4,7,4,6" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
关键是使用 DataGridTemplateColumn
而不是 DataGridTextColumn
。
那么你可以这样做:
<DataGridTemplateColumn
Width="80">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Foo}" Padding="4,7,4,6"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>