【问题标题】:MVVM. Is adding code to View justified in some cases?MVVM。在某些情况下向 View 添加代码是否合理?
【发布时间】: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 一无所知。这样对吗?我是走对了还是错过了什么?

一般来说,向视图添加实现什么时候有意义?

【问题讨论】:

    标签: wpf mvvm binding


    【解决方案1】:

    是的,这是完全可以接受的。由于这里的逻辑是 100% View 相关的,所以添加到 View 中是没有问题的。

    MVVM 是将您的应用程序逻辑与您的视图逻辑分开,而不一定是从您的视图中剥离 100% 的代码。

    话虽如此,为此还有其他代码替代方案。附加属性(或行为)是此类任务的绝佳选择 - 它们具有稍后可在其他视图中重用的巨大优势,因此如果您决定希望在用户的其他部分中使用相同的行为,则以后不必重新发明它界面。

    【讨论】:

    • 附加属性/行为的任何示例,我有兴趣了解更多信息!
    • @pete:我写了一篇描述使用行为的文章:reedcopsey.com/2009/10/09/…
    • @pete:Nishant Sivakumar 也将它移植到了一个标准的附加道具上。见:reedcopsey.com/2010/04/15/…
    • 感谢您回答这个问题。正如我之前提到的,这正是我的想法。我喜欢你的解释,即整个 MVVM 并不是要从视图中剥离 100% 的代码。现在我要了解更多关于附加属性和行为的信息。再次感谢。
    猜你喜欢
    • 2018-05-04
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多