1

我正在研究Bea Stollnitz在她的博客上提供的数据虚拟化解决方案。提供此解决方案以与. 我只是想让它与WPF一起工作,但我的尝试没有成功。ListView DataGrid

是她提供的完整工作示例的代码。

提供的ListView代码中的 绑定到自定义AsyncVirtualizingCollection集合class。但是当我尝试将此集合绑定到DataGrid时,它确实显示空白行。数据不会出现在DataGrid.

现在魔术发生在ControlTemplateListViewItem. 我已将其归零ContentPresenterControlTemplate. 已ContentPresenter被替换BorderContentPresenter. 以下是相同的XAML

<Style TargetType="{x:Type ListViewItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border BorderThickness="{TemplateBinding BorderThickness}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        Background="{TemplateBinding Background}"
                        CornerRadius="2"
                        SnapsToDevicePixels="true">
                    <Border Name="InnerBorder" CornerRadius="1" BorderThickness="1">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition MaxHeight="11"/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>
                            <Rectangle Name="UpperHighlight" Visibility="Collapsed" Fill="#75FFFFFF"/>
                            <GridViewRowPresenter Grid.RowSpan="2"
                                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                                    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                                    Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Data}"/>
                            <StackPanel Name="Loading" Orientation="Horizontal" Grid.RowSpan="2" Visibility="Collapsed">
                                <TextBlock Text="Loading item " />
                                <TextBlock Text="{Binding ItemNumber}" />
                                <TextBlock Text="..." />
                            </StackPanel>
                        </Grid>
                    </Border>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

现在,仔细观察第二个边框GridViewRowPresenterGrid内部,您可能会注意到:Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Data}"

我认为这是有助于显示数据的行。

ControlTemplate我尝试为以下内容创建一个DataGridCell

<Style TargetType="{x:Type DataGridCell}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="DataGridCell" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
                    BorderBrush="{TemplateBinding Border.BorderBrush}" 
                    Background="{TemplateBinding Panel.Background}" 
                    SnapsToDevicePixels="True">
                    <ContentPresenter Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Data}" 
                        ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
                        ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" 
                        SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

但我仍然没有得到任何数据DataGrid

我不确定我在这里缺少什么,因为我不擅长模板和样式。

我试图保持尽可能精确,以避免让它太无聊。我您认为我错过了任何信息,请务必询问,我很乐意提供。

任何帮助将不胜感激。

注意:链接的应用程序面向 .Net 3.5,需要转换为 .Net 4.0 才能使用 DataGrid。

4

1 回答 1

2

由于DataWrapper是您的项目,DataGrid它将实际项目包装在DataProperty 中,因此您应该更新列绑定,例如:

<DataGrid Grid.Row="2" ItemsSource="{Binding}" AutoGenerateColumns="False" 
                       IsSynchronizedWithCurrentItem="True" Name="dg"  
                       HorizontalAlignment="Center" Margin="5" Height="300" Width="400"> 
     <DataGrid.Columns> 
           <DataGridTextColumn Header="Id" Binding="{Binding Data.Id}" Width="100"/>  
           <DataGridTextColumn Header="Name" Binding="{Binding Data.Name}" Width="100"/>  
     </DataGrid.Columns> 
</DataGrid>

同样,您必须在 ControlTemplate 中设置绑定,例如:

<ContentPresenter Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" />
于 2013-09-20T10:32:53.857 回答