wpf datagrid autoscroll

时间:2011-12-01 21:05:56

标签: wpf datagrid autoscroll

我想设置一个数据网格,这样无论何时将项目添加到其itemssource,datagrid都会向下滚动以显示最后一项。

datagrid位于datatemplate中,因此我无法设置X:name属性并直接从代码隐藏中访问它。

我想到的是使用一个datagrid事件,当添加一行并且网格自身滚动时会触发该事件。

这里有一些伪造的代码,概述了我如何设置的东西:


UI.XAML exerpt

<TabControl ItemsSource="{Binding Parents}" x:Name="ProductsTab">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Key}"/>
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <DataGrid Margin="5" ItemsSource="{Binding Value.Children}">
                <DataGrid.Columns>
                    <Column Column definitions removed for your sanity/>
                </DataGrid.Columns>
            </DataGrid>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

UI.XAML.CS exerpt

public class UI
{
    //Thanks to Dr. WPF for the ObservableDictionary class
    public ObservableDictionary<string, Parent> Parents {get; set;}
}

Parent.CS

public class parent
{
    public ObservableCollection<Child> Children {get; set;}
}

数据网格不可编辑。

如果您想知道,我已经阅读了帖子“如何在WPF数据网格上自动滚动”,如果我能找到一个项目被添加到datagrid itemssource时触发的事件,那么该帖子中的代码将对我有用。

任何想法?

2 个答案:

答案 0 :(得分:0)

将自动滚动创意与来自this questionthis MSDN thread的想法相结合:不是收听网格事件来检测行添加,而是收听来自ItemsSource的事件。

编辑:由于你不喜欢这个建议,你可以尝试挂钩LoadingRow,但我强烈怀疑这需要EnableRowVirtualization = false才能工作(我还没试过)。如果你的收藏量变大,关闭行虚拟化可能会导致严重的性能损失。

答案 1 :(得分:0)

您可以通过在可视化树中执行“搜索”来访问DataGrid,即使它位于DataTemplate中:VisualTreeHelper.GetChildCount // VisualTreeHelper.GetChild,然后再次测试类型,直到找到您的网格。您可以使用ScrollBar使用相同类型的方法,然后可以挂钩事件处理程序并使用代码隐藏逻辑。