2009-06-11 10 views
5

Widzę dwa sposoby na podłączenie ViewModel do widoku. Jedną z nich jest XAML, a druga wtrysk zależności w kodzie.Podłączanie ViewModel do widoku w Silverlight

Która metoda jest bardziej zalecana? Wolę metodę xaml, ponieważ nie chcę żadnego kodu w kodzie, ale czy są jakieś problemy z jednym z drugim?

<navigation:Page x:Class="MyNamespace.MyViewModel" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ViewModel="clr-namespace:MyNameSpace.MyViewModel" 
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
    Title="ViewModel Page" > 

    <navigation:Page.Resources> 
     <ViewModel:MyViewModel x:Key="ViewModel"></ViewModel:MyViewModel> 
    </navigation:Page.Resources> 

    <Grid x:Name="LayoutRoot" Background="White" 
      DataContext="{StaticResource ViewModel}"> 

    </Grid> 
</navigation:Page> 

LUB

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Windows.Navigation; 

namespace MyNamespace 
{ 
    public partial class MyView : Page 
    { 
     public MyView() 
     { 
      InitializeComponent(MyViewModel viewModel); 

      this.DataContext = viewModel; 
     } 
    } 
} 

Odpowiedz

3

Shawn ma dobry post na View or ViewModel pierwszy. Posiadanie VM w XAML daje Blendability (widząc przykładowe dane w Blend), co jest fajne, ale cena musi wepchnąć informacje z powrotem do widoku. John Papa zrezygnował z tego podejścia z tego powodu.

Używam pomysłu Shawn's Marriage (patrz link powyżej).

HTH -Erik

+0

Hmm .. dzięki za link. Teraz to czytam. Myślę, że muszę to przeczytać jeszcze kilka razy, ponieważ nic nie dostaję. Shawn mówi: "W obu tych metodach nie podoba mi się lepkość widoku do modelu widoku. Oba te podejścia implikują relację jeden-do-jednego, która, mimo że jest to powszechny przypadek, nie zawsze ma miejsce . " ale z View-First wiele widoków może być databound do jednej maszyny wirtualnej. Czy widok może być powiązany z więcej niż jedną maszyną wirtualną? hmmm .. znowu, domyślam się, że jeśli twój V był prostą siatką, mógł chcieć mieć to związane z różnymi maszynami wirtualnymi. –

+0

Do tej pory jestem fanem utrzymywania relacji jeden-do-jednego między Vs a maszynami wirtualnymi. Co nie znaczy, że jestem przeciwko hierarchii. Oznacza to, że widok może zawierać podprzestrzennie każdy z jego własną maszyną wirtualną, a to wydaje się działać całkiem dobrze. –

+0

W naszej aplikacji mamy standardowy widok siatki, który wyświetla tylko wiersze danych. Dane mogą pochodzić z różnych ViewModels, więc trzymanie go jeden na jeden nie ma dla nas sensu. Nie ma sensu posiadanie wielu widoków siatki, gdy wszystkie są takie same, z wyjątkiem zawartych w nich danych. –

0

Sposób masz go tu, pójdę z XAML. Istnieją inne sposoby ustawienia właściwości DataContext. Jeśli jesteś zainteresowany, spójrz na środowisko Microsoft CAG dla WPF.

0

mam ustawić maszynę wirtualną w kodzie bo to make testowanie View dużo łatwiejsze. Justin Anioł ma wielki post na to:

public partial class Page : UserControl 
{ 
    private PageViewModel _viewModel = new PageViewModel(); 

    public PageViewModel ViewModel 
    { 
     get { return _viewModel; } 
     set { _viewModel = value; } 
    } 

    public Page() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(Page_Loaded); 
    } 

    void Page_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.DataContext = ViewModel; 
    } 

} 

znalazłem swoje stanowisko, aby być bardzo przydatny do nauki o intricasies testowania okolic wzorzec MVVM.

http://silverlight.net/blogs/justinangel/archive/2009/02/25/silverlight-unit-testing-rhinomocks-unity-and-resharper.aspx

+0

Dzięki za link. Wciąż to czytam, ale wolę teraz metodę Shawna. Muszę poświęcić trochę więcej czasu na zastanowienie się nad tym, ale chcę wyraźnie odłączonej VM i V. –

4

używam klasy I dub jest "screen", który obsługuje triadę MVVM. Zaczynałem od tego, że V został wprowadzony do VM, następnie VM jako zasób w V, ale w końcu koncepcja Screen działała najlepiej dla mnie. Pozwala mi używać V i VM bez wzajemnego sprzężenia. Usuwa również inną funkcjonalność w mojej ogólnej strukturze prezentacji. Oto konstruktora dla mojej klasy ekran jako przykład:

public CatalogItemScreen(IUnityContainer container) : base(container) 
    { 
     this.ViewModel = Container.Resolve<ICatalogItemViewModel>(); 
     this.View = Container.Resolve<CatalogItemView>(); 
     this.View.DataContext = this.ViewModel; 
    } 

Zauważ, że VM jest tworzony na ekranie tworzony jest tutaj V i 2 są ze sobą związane. Ta próbka używa jedności i pryzmatu, ale nie jest to konieczne.

Powiązane problemy