2009-09-25 27 views
5

tôi có một cái nhìn chứa mà trông giống như sauDataTemplate-driven Xem tiêm với MVVM

<UserControl x:Class="Views.ContainerView"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <DataTemplate DataType="{x:Type viewmodels:AViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type viewmodels:BViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type viewmodels:CViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type viewmodels:DViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
     </ResourceDictionary> 
    </UserControl.Resources> 
    <Grid> 
     <ListBox ItemsSource="{Binding Path=AvailableViewModels}" 
      SelectedItem="{Binding Path=CurrentViewModel}" 
      IsSynchronizedWithCurrentItem="True" /> 
     <ContentControl Content="{Binding Path=CurrentViewModel}" /> 
    </Grid> 
</UserControl> 

Tất cả viewmodels tôi kế thừa BaseViewModel vì vậy tôi quay quan điểm của tôi vào này

<UserControl x:Class="Views.ContainerView"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <DataTemplate DataType="{x:Type viewmodels:BaseViewModel}"> 
       <views:MyView /> 
      </DataTemplate> 
     </ResourceDictionary> 
    </UserControl.Resources> 
    <StackPanel> 
     <ListBox ItemsSource="{Binding Path=AvailableViewModels}" 
      SelectedItem="{Binding Path=CurrentViewModel}" 
      IsSynchronizedWithCurrentItem="True" /> 
     <ContentControl Content="{Binding Path=CurrentViewModel}" /> 
    </StackPanel> 
</UserControl> 

nghĩ nó sẽ nhanh chóng chỉ một MyView đơn và chỉ rebind viewmodel khi ListBox.SelectedItem thay đổi. Tôi có hiểu hành vi này chính xác không? Đây có phải là phương pháp được ưa thích không? Làm thế nào tôi có thể xác minh rằng tôi không khuấy bộ nhớ khi tôi chuyển đổi giữa các chế độ xem?

Trả lời

1

Nó sẽ khởi tạo MyView mới cho từng kiểu xem bạn sử dụng. Nếu bạn muốn sử dụng lại các điều khiển người dùng của mình, bạn có thể đặt thuộc tính DataContext trên mỗi điều khiển người dùng.

2

Để mở rộng câu trả lời của Pavel và làm rõ điều gì sẽ xảy ra khi lượt xem khi bạn thay đổi chế độ xem là chế độ xem mới sẽ được tạo cho chế độ xem mới và chế độ xem cũ sẽ hy vọng là rác được thu thập kịp thời .

Vấn đề với điều này đôi khi chúng tôi sẽ có lượt xem đăng ký một số sự kiện ở mã sau (sự kiện không yếu) và điều này sẽ ngăn không cho thu thập và bạn sẽ bị rò rỉ bộ nhớ.

Hai phương pháp tiếp cận.

  1. Bất kỳ đăng ký sự kiện nào ở chế độ xem mã phía sau sẽ bị làm suy yếu (EventAggregator in PRISM) để cho phép thu gom rác.
  2. Đăng ký phiên bản của chế độ xem với vùng chứa thống nhất và giải quyết nó khi bạn cần sử dụng lại nó. Trước khi bạn tiêm nó vào khu vực, chỉ cần cập nhật DataContext.

Hy vọng điều này sẽ hữu ích.