2011-07-27 14 views
9

Witam Buduję aplikację wpf, w której na ekranie będą się znajdować różne kontrolki użytkownika do wykonywania różnych aplikacji.Jak korzystać z kontroli użytkownika w WPF MVVM

Chciał (a) bym wiedzieć, jak to zrobić w MVVM? Czy każda kontrolka użytkownika ma swój własny model widoku, czy też powinna nadal wiązać się z głównymi właściwościami modelu widoku?

Proszę sugerować dobre podejście. Dzięki,

Odpowiedz

5

Kiedy używam UserControl, przekazuję dane przez DependencyProperties. Moje UserControls nie ma ViewModels. UserControls obsługuje tylko przekazane dane w bardzo szczególny sposób.

Ale jeśli mam widok, który zawiera niektóre widoki, wolę mieć dla każdego sub-widoku własny model. Model ten będę wiązał poprzez właściwość ViewModel z MainView.

Kilka przykładów:

UserControl1, Code za:

public partial class UserControl1 : UserControl 
{ 
    public MyClass MyProperty 
    { 
     get { return (MyClass)GetValue(MyPropertyProperty); } 
     set { SetValue(MyPropertyProperty, value); } 
    } 

    public static readonly DependencyProperty MyPropertyProperty = 
     DependencyProperty.Register("MyProperty", typeof(MyClass), typeof(UserControl1), new UIPropertyMetadata(null)); 


    public UserControl1() 
    { 
     InitializeComponent(); 
    } 
} 

public class MyClass 
{ 
    public int MyProperty { get; set; } 
} 

A Wykorzystanie w widoku XAML:

<Window x:Class="Sandbox.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Sandbox="clr-namespace:Sandbox"> 
    <Grid> 
    <Sandbox:UserControl1 MyProperty="{Binding MyOtherPropertyOfTypeMyClassInMyViewModel, Mode=TwoWay}" /> 
    </Grid> 

Nadzieja to pomaga

+0

cześć Nigdy nie użyłem DependencyProperties. Czy możesz podać mi link lub krótko wyjaśnić, w jaki sposób kontrola użytkownika powinna korzystać z właściwości Dependency. Czy powinienem utworzyć typ dla jednego elementu userControl, a następnie powiązać go z różnymi właściwościami w widoku? – ganeshran

+1

Dodałem prosty przykład: – WaltiD

+0

Dzięki WaltiD spróbuję tego podejścia. Czy mogę również powiązać go z typem zdefiniowanym przez użytkownika? – ganeshran

1

Dobre pytanie - ale nie sądzę, że istnieje jedna prosta odpowiedź.

To zależy w dużym stopniu od kształtu danych. Jeśli różne elementy sterowania użytkownika są różnymi widokami na tych samych danych, to nie ma powodu, dla którego nie mogą dzielić tego samego modelu ViewModel ... to jedna z sił napędowych MVVM - możesz dać ten sam ViewModel innym Viewerom, aby pokazać to samo dane na różne sposoby.

Ale potem znowu, jeśli Twój ViewModel zaczyna naprawdę się rozrastać i nie ma zbytniego nakładania się, a następnie rozbić go na mniejsze modele ViewModels. Może wtedy Twój główny ViewModel staje się po prostu menadżerem ViewModel z kolekcją ViewModels, aby przekazać je do różnych Kontrolek Użytkownika?

+0

Ciebie jest intere żądło rozwiązanie. Spróbuję to zaimplementować. Próbowałem użyć wielu viewmodeli, ale nie udało mi się przekonać ich do komunikowania się ze sobą. Czy myślisz, że każdy datacontext formantu użytkownika powinien odpowiadać niestandardowemu typowi, który jest właściwością głównego viewmodelu. Czy byłoby to zgodne z MVVM? – ganeshran

+0

tak - brzmi jak rozsądne podejście – IanR

Powiązane problemy