我想设置一个数据网格,这样无论何时将项目添加到其itemssource,datagrid都会向下滚动以显示最后一项。
datagrid位于datatemplate中,因此我无法设置X:name属性并直接从代码隐藏中访问它。
我想到的是使用一个datagrid事件,当添加一行并且网格自身滚动时会触发该事件。
这里有一些伪造的代码,概述了我如何设置的东西:
<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>
public class UI
{
//Thanks to Dr. WPF for the ObservableDictionary class
public ObservableDictionary<string, Parent> Parents {get; set;}
}
public class parent
{
public ObservableCollection<Child> Children {get; set;}
}
数据网格不可编辑。
如果您想知道,我已经阅读了帖子“如何在WPF数据网格上自动滚动”,如果我能找到一个项目被添加到datagrid itemssource时触发的事件,那么该帖子中的代码将对我有用。
任何想法?
答案 0 :(得分:0)
将自动滚动创意与来自this question或this MSDN thread的想法相结合:不是收听网格事件来检测行添加,而是收听来自ItemsSource
的事件。
编辑:由于你不喜欢这个建议,你可以尝试挂钩LoadingRow
,但我强烈怀疑这需要EnableRowVirtualization = false
才能工作(我还没试过)。如果你的收藏量变大,关闭行虚拟化可能会导致严重的性能损失。
答案 1 :(得分:0)
您可以通过在可视化树中执行“搜索”来访问DataGrid,即使它位于DataTemplate中:VisualTreeHelper.GetChildCount // VisualTreeHelper.GetChild,然后再次测试类型,直到找到您的网格。您可以使用ScrollBar使用相同类型的方法,然后可以挂钩事件处理程序并使用代码隐藏逻辑。