2016-11-07 1 views
0

Ich lerne catel mvvm Rahmen, und habe einige Verständnisprobleme. Versuchen, einfaches Projekt zu erstellen, sehr einfach, mit Catel-Framework. haben ein ModellWie man einfache Catel Dependency-Injektion

public class First : ModelBase 
{ 
    public String FirstValue 
    { 
     get { return GetValue<String>(FirstValueProperty); } 
     set { SetValue(FirstValueProperty, value); } 
    } 

    public static readonly PropertyData FirstValueProperty = RegisterProperty("FirstValue", typeof(String), "First Text"); 

    public String SecondValue 
    { 
     get { return GetValue<String>(SecondValueProperty); } 
     set { SetValue(SecondValueProperty, value); } 
    } 

    public static readonly PropertyData SecondValueProperty = RegisterProperty("SecondValue", typeof(String), "Second text"); 
} 

Dann Viewmodel

public class FirstViewModel : ViewModelBase 
{ 
    public FirstViewModel(First first) 
    { 
     Argument.IsNotNull(() => first); 

     First = first; 
    } 

    [Model] 
    public First First 
    { 
     get { return GetValue<First>(TestModelProperty); } 
     private set { SetValue(TestModelProperty, value); } 
    } 
    public static readonly PropertyData TestModelProperty = RegisterProperty("TestModel", typeof(First)); 

    [ViewModelToModel("First")] 
    public String FirstValue 
    { 
     get { return GetValue<String>(FirstValueProperty); } 
     set { SetValue(FirstValueProperty, value); } 
    } 
    public static readonly PropertyData FirstValueProperty = RegisterProperty("FirstValue", typeof(String)); 

    [ViewModelToModel("First")] 
    public String SecondValue 
    { 
     get { return GetValue<String>(SecondValueProperty); } 
     set { SetValue(SecondValueProperty, value); } 
    } 
    public static readonly PropertyData SecondValueProperty = RegisterProperty("SecondValue", typeof(String)); 
} 

Endlich Service

public class FirstService : IFirstService 
{ 
    public First Read() 
    { 
     return new First(); 
    } 

    public First Write(First first) 
    { 
     first.SecondValue = first.FirstValue; 
     return first; 
    } 
} 

Mit Blick

<catel:StackGrid> 
     <catel:StackGrid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </catel:StackGrid.RowDefinitions> 
     <catel:StackGrid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="Auto" /> 
     </catel:StackGrid.ColumnDefinitions> 
     <Label Content="First value" /> 
     <TextBox Text="{Binding FirstValue}" TextAlignment="Center" Width="100"/> 
     <Label Content="Second value" /> 
     <TextBox Text="{Binding FirstSecond}" TextAlignment="Center" Width="100"/> 
    </catel:StackGrid> 

Und Fenster

012 haben haben

Wie sipmle catel Dependency Injection, das auf Start-Anwendung in beiden Textfeldern war Standarddaten aus der ersten Klasse. Und wie durch Drücken der "Write" -Schaltfläche kopieren Sie jemanden, der in das erste Textfeld eintritt, in das zweite Textfeld, indem Sie den Dienst verwenden. Ich werde versucht, dies anhand eines Beispiels zu tun. Erste Schritte mit der catel-Dokumentation. Aber arbeite nicht.

Antwort

1

allererst können Sie Catel.Fody nuget Paket benutzen, die Sie Ihren Code vereinfachen lassen:

public class FirstModel : ModelBase 
{ 
    public String FirstValue { get; set; } 
    public String SecondValue { get; set; } 
} 

public class FirstViewModel : ViewModelBase 
{ 
    private readonly IFirstService _firstService; 

    public FirstViewModel(IFirstService firstService) 
     : this(new First(), firstService) 
    { 

    } 

    public FirstViewModel(First first, IFirstService firstService) 
    { 
     Argument.IsNotNull(() => first); 
     Argument.IsNotNull(() => firstService); 

     _firstService = firstService; 
     First = first; 

     WriteFirst = new Command(OnWriteFirstExecute); 
    } 

    [Model] 
    // you can use ExposeAttribute if you don't want to use 'FirstValue' 
    // property inside of ViewModel and only want to use it for binding 
    [Expose(nameof(FirstModel.FirstValue))] 
    public FirstModel First { get; set; } 

    [ViewModelToModel(nameof(First)] 
    public String SecondValue { get; set; } 

    public Command WriteFirst { get; } 

    private void OnWriteFirstExecute() 
    { 
     // here you can put you logic (not sure what you want to achieve) 
     // _firstService.Write() 
    } 
} 

wenn Sie Dependency Injection verwenden möchten, müssen Sie Sie überall vor der ersten Injektion in Code Register-Service. Zum Beispiel können Sie tun, dass in App.xaml.cs oder Sie ModileInit.Fody nuget Paket verwenden können, und registrieren Sie alle Ihre Dienste in ModuleInitializer.cs

var serviceLocator = this.GetServiseLocator(); 
// or instatic context you can use: 
// var serviceLocator = ServiceLocator.Default; 
serviseLocator.RegisterType<IFirstService, FirstService>(); 

Eine weitere wichtige Sache ist, dass Sie ein Ansichtsmodell für jede Ansicht verwenden, damit ich Unterzeichne dich in diesem Teil nicht wirklich. Versuchen Sie einfach, xaml in eine einzelne Datei (in Ihrem Fall denke ich, es ist ein Fenster)

Verwandte Themen