2010-10-25 24 views
7

我有一個視圖,它具有綁定到我的ViewModel(MVVM模式)的項目列表。MVVM。在某些情況下向View添加代碼是否合理?

比方說,它看起來像這樣:

<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模式的方法,我仍然可以在視圖的文件後面的代碼中實現自動滾動?這似乎是相當邏輯的,因爲滾動行爲與虛擬機沒有任何關係,ViewModel也不知道任何有關View的內容。這樣對嗎?我正確的方式或者我錯過了什麼?

一般來說,向View添加實現有意義嗎?

回答

9

是的,這是完全可以接受的。由於這裏的邏輯是100%查看相關的,所以將它添加到視圖沒有問題。

MVVM是關於從您的查看邏輯中分離您的應用程序邏輯,而不一定是關於從視圖中剝離100%的代碼。

這就是說,這裏有其他代碼。附加屬性(或行爲)對於這些任務來說是一個很好的選擇 - 它們具有可以在其他視圖中重複使用的巨大優勢,因此如果您決定要在用戶的其他部分中使用相同的行爲,接口。

+0

任何附加的屬性/行爲的例子,我想更多地瞭解這個! – 2010-10-25 16:34:32

+2

@pete:我寫了一篇描述使用行爲的文章:http://reedcopsey.com/2009/10/09/using-behaviors-to-allow-the-viewmodel-to-manage-view-lifetime-in-mv -vm/ – 2010-10-25 16:37:04

+2

@pete:Nishant Sivakumar也將它移植到標準附屬支柱上。請參閱:http://reedcopsey.com/2010/04/15/attached-property-port-of-my-window-close-behavior/ – 2010-10-25 16:37:33

相關問題