【发布时间】:2011-04-30 07:44:46
【问题描述】:
我有一个视图,其中包含绑定到我的视图模型(MVVM 模式)的项目列表。
假设它看起来像这样:
<ScrollViewer Width="Auto" Height="Auto">
<ItemsControl ItemsSource="{Binding Path=MessageLog}"
Grid.IsSharedSizeScope="True"
ScrollViewer.CanContentScroll="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150" SharedSizeGroup="FullName"/>
<ColumnDefinition Width="*" SharedSizeGroup="MessageLog"/>
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text="{Binding Path=PostedBy.FullName}" />
<TextBlock Text="{Binding Path=DatePosted}" />
</StackPanel>
<TextBlock Grid.Column="1" Text="{Binding Path=MessageLog}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
当用户向 MessageLog 添加内容时(VM 中有一个属性 MessageLog),我想自动滚动到最近的项目。
换句话说,我只想在用户输入消息并按回车键时自动移动滚动条(就像 Skype 一样)。
MessageLog 上的绑定按预期工作,并且项目在视图上更新。 (我很高兴,我想就这样离开)
我想知道如果使用 MVVM 模式方法,我还可以在 View 的代码隐藏文件中实现自动滚动吗?这似乎很合乎逻辑,因为滚动行为与 VM 无关,而 ViewModel 对 View 一无所知。这样对吗?我是走对了还是错过了什么?
一般来说,向视图添加实现什么时候有意义?
【问题讨论】: