WPF GridView 共享所有列的单元格模板

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15955540/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 08:34:20  来源:igfitidea点击:

WPF GridView shared cell template for all columns

wpflistviewgridviewbinding

提问by ChandlerPelhams

I am trying to create a DataTemplatethat can be shared for all columns of a GridView, which has it's columns created dynamically (through code-behind).

我正在尝试创建一个DataTemplate可以为所有列共享的 a GridView,它的列是动态创建的(通过代码隐藏)。

I would like to create the DataTemplateas a resource in XAML instead of entirely in code-behind, but I can't figure out how to get the bindings to work properly.

我想DataTemplate在 XAML 中创建作为资源而不是完全在代码隐藏中,但我不知道如何让绑定正常工作。

The following is the closest I could come up with (but does not work):

以下是我能想到的最接近的(但不起作用):

<DataTemplate x:Key="ListViewCellTemplate">
        <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type GridViewColumn}}}" />
    </DataTemplate>

This template is assigned as the CellTemplateof each column as follows:

该模板被分配为CellTemplate每列的 ,如下所示:

BindableDataTable table = this.DataContext as BindableDataTable;

            foreach (BindableDataColumn c in table.Columns)
            {
                GridViewColumn col = new GridViewColumn();
                col.Header = c.ColumnName;

                col.CellTemplate = this.FindResource("ListViewCellTemplate") as DataTemplate;
                v.Columns.Add(col);
            }

回答by New Bee

Answer:

回答:

Set a DataTemplate in your resources

在您的资源中设置 DataTemplate

  <UserControl.Resources>
        <ResourceDictionary>
            <DataTemplate x:Key="GridViewCellTemplateStyle">
                <TextBlock Text="{Binding}">
                    <TextBlock.InputBindings>
                        <MouseBinding Gesture="LeftDoubleClick" Command="{Binding DataContext.CommandDoubleClick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"/>
                    </TextBlock.InputBindings>
                </TextBlock>
            </DataTemplate>
        </ResourceDictionary>
    </UserControl.Resources>

Create your grid view and make the columns inherit this datatemplate

创建您的网格视图并使列继承此数据模板

 <ListView>
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="Auto" Header="Column1" CellTemplate="{StaticResource GridViewCellTemplateStyle}"/>
                    <GridViewColumn Width="Auto" Header="Column2" CellTemplate="{StaticResource GridViewCellTemplateStyle}"/>
                    <GridViewColumn Width="Auto" Header="Column3" CellTemplate="{StaticResource GridViewCellTemplateStyle}"/>
                    <GridViewColumn Width="Auto" Header="Column4" CellTemplate="{StaticResource GridViewCellTemplateStyle}"/>
                </GridView>
            </ListView.View>
        </ListView>

This exmaple shows you how to create a double clickable row in a GridViewColumn. Just change the DataTemplate as you see fit

此示例向您展示如何在 GridViewColumn 中创建可双击的行。只需更改您认为合适的 DataTemplate

回答by Jonathan Beresford

I'm having the exact same problem.

我遇到了完全相同的问题。

I want to be able to apply the data template to different columns but have each column bound to a separate data field.

我希望能够将数据模板应用于不同的列,但将每一列绑定到一个单独的数据字段。

<ListView ItemsSource="{Binding}"  Name="listViewIMS" Grid.Row="1" Margin="0,0,0,4" FontSize="11" AlternationCount="2" SelectionMode="Extended">

        <ListView.Resources>
            <DataTemplate x:Key="Templ">
                <TextBlock TextAlignment="Left" Text="{Binding}"/>
            </DataTemplate>
            <DataTemplate x:Key="Tempr">
                <TextBlock Width="78" Margin="-6,0" TextAlignment="Right" Text="{Binding}" /> 
            </DataTemplate>
            <Style x:Key="HeaderStyleRight" TargetType="GridViewColumnHeader">
                <Setter Property="HorizontalContentAlignment" Value="Right"/>
            </Style>
            <Style x:Key="HeaderStyleLeft" TargetType="GridViewColumnHeader">
                <Setter Property="HorizontalContentAlignment" Value="Left"/>
            </Style>                
        </ListView.Resources>

        <ListView.View>
            <GridView x:Name="gridViewInvoices">
                <GridViewColumn Width="80" DisplayMemberBinding="{Binding Document}">
                    <GridViewColumnHeader Tag="docNo" Content="Document" />
                </GridViewColumn>                   
                <GridViewColumn Width="220" DisplayMemberBinding="{Binding Customer}">
                    <GridViewColumnHeader Tag="customer" Content="Customer"/>
                </GridViewColumn>
                <GridViewColumn Width="100" DisplayMemberBinding="{Binding inv_date, StringFormat='dd/MM/yy'}" >
                    <GridViewColumnHeader Tag="date" Content="Date" />
                </GridViewColumn>
                <GridViewColumn Width="100" DisplayMemberBinding="{Binding inv_l_catalogue}" >
                    <GridViewColumnHeader Tag="catalogue" Content="Item" />
                </GridViewColumn>
                <GridViewColumn Width="60" DisplayMemberBinding="{Binding inv_l_qty}" >
                    <GridViewColumnHeader Tag="qty" Content="Qty" />
                </GridViewColumn>
                <GridViewColumn Width="80" DisplayMemberBinding="{Binding inv_l_price, StringFormat='0.00' }" >
                    <GridViewColumnHeader Tag="unitPrice" Content="Price" />
                </GridViewColumn>
                <GridViewColumn Width="50" DisplayMemberBinding="{Binding inv_l_per}" >
                    <GridViewColumnHeader Tag="per" Content="Per" />
                </GridViewColumn>
                <GridViewColumn Header="Goods" CellTemplate ="{StaticResource Tempr}" HeaderContainerStyle="{StaticResource HeaderStyleRight}" Width="80" >

                    <!--GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Width="78" Margin="-6,0" TextAlignment="Right" Text="{Binding inv_l_lgoods2, StringFormat='0.00'}"  />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>-->
                </GridViewColumn>
            </GridView>
        </ListView.View>  

    </ListView>