【问题标题】:WPF DataTemplate and columns definitionWPF DataTemplate 和列定义
【发布时间】:2020-01-09 10:05:05
【问题描述】:

我需要改进网格的渲染。我有一个模板:

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

基本上,对于我收藏的每条记录,都会渲染一个网格,但由于我有 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>   

【问题讨论】:

    标签: wpf mvvm datatemplate


    【解决方案1】:

    关键是使用DataGridTemplateColumn 而不是DataGridTextColumn。 然后你可以这样做:

    <DataGridTemplateColumn
        Width="80">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Foo}" Padding="4,7,4,6"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    

    【讨论】:

    • 我应该把 DataGridTemplateColumn 放在哪里?因为我需要在 中使用
    • 放到&lt;DataGrid.Columns&gt;里面
    • 这意味着我不必将 与列自定义一起使用?因为那是我最初的任务
    • 好吧,您确实使用了DataTemplate,但DataTemplate 被放置在DataGridTemplateColumn.CellTemplate 中。因此,这与您最初认为的相反。再次查看问题中的第二个代码块,您已经这样做了。您已经使用CellTemplateSelector 根据数据选择正确的模板,这就是这样做的方法。这不工作吗?
    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多