代码之家  ›  专栏  ›  技术社区  ›  Novitzky

MVVM公司。在某些情况下,向视图添加代码是否合理?

  •  7
  • Novitzky  · 技术社区  · 14 年前

    我有一个视图,它有一个绑定到我的ViewModel(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添加内容时(在虚拟机中有一个属性MessageLog),我想自动滚动到最近的项目。

    换句话说,我只想在用户键入消息并按回车键时自动移动滚动条(就像Skype那样)。

    MessageLog上的绑定按预期工作,并在视图上更新项。(我对此很高兴,我想就这样离开)

    我想知道,如果使用MVVM模式方法,我还能在视图的代码隐藏文件中实现自动滚动吗?这看起来很有逻辑性,因为滚动行为与VM无关,而ViewModel对视图一无所知。对吗?我是走对了路还是我错过了什么?

    1 回复  |  直到 14 年前
        1
  •  9
  •   Reed Copsey    14 年前

    是的,这完全可以接受。因为这里的逻辑是100%与视图相关的,所以将它添加到视图中没有问题。

    MVVM是关于分离 从您的视图逻辑来看,不一定要从视图中剥离100%的代码。

    这就是说,有其他方法可以替代代码。附加的属性(或行为)对于类似这样的任务是一个很好的选择-它们具有稍后在其他视图中可重用的巨大优势,因此如果决定在用户界面的其他部分中使用相同的行为,以后就不会重新创建它。