5 Stimmen

Entity Framework CTP5 Code First, WPF - MVVM-Modellierung

Ich habe mein Modell alle Setup für meine WPF-Anwendung und arbeiten mit Entity Framework ctp5 Code zuerst, hier ist eine Beispielmodellklasse:

public class Task
{
    public int ID { get; set; }
    public int Index { get; set; }
    public string Content { get; set; }
    public int Indentation { get; set; }
    public DateTime Start { get; set; }
    public decimal Effort { get; set; }
    public decimal CompletedEffort { get; set; }
    public decimal Cost { get; set; }
}

Was wäre der empfohlene Weg, um mein Ansichtsmodell zu erstellen? Meine Ansichtsmodelle werden INotifyPropertyChanged implementieren, ich möchte nicht, dass die Modellklassen keinen UI-spezifischen Code haben - so dass sie leicht in anderen Anwendungen wiederverwendet werden können. Sollte ich alle Modelleigenschaften virtuell machen und sie dann im Ansichtsmodell außer Kraft setzen? (Das scheint mir eine Menge unnötiger Code zu sein...) Würde EF-Code zunächst mit dieser Art von Format gut zusammenspielen?

Modifier Diese Frage ist in gewisser Weise ähnlich In MVVM sollte das ViewModel oder Model INotifyPropertyChanged implementieren? Die einzigen Lösungen scheinen jedoch darin zu bestehen, dem Modell eine Logik hinzuzufügen, die ich für die Benutzeroberfläche halte. Vielleicht kann ich eine Art von Delegaten zum Modell hinzufügen und Haken in das aus dem Viewmodel, die wiederum INotifyPropertyChanged verwenden wird... so etwas wie dieses?

    public class Task
    {
        public delegate void HandleChange(string propertyName);
        public HandleChange ChangeHandler;

        public int ID 
        { 
            get
            {
                return ID;
            } 
            set
            {
                if(ID != value)
                {
                    ID = value;
                    ChangeHandler("ID");
                }
            }
        }
...

4voto

Slauma Punkte 171348

Was ich tue, ist eine Instanz meiner Modellklasse zu einer Eigenschaft im ViewModel zu machen und dann implementieren INotifyPropertyChanged direkt auf das Model für die Model-Eigenschaften und auf das ViewModel nur für die Model-Instanz, wie folgt:

public class Task : INotifyPropertyChanged
{
    // Implementation of INotifyPropertyChanged
    // Raising the PropertyChanged event in the Setters of all properties
}

public class TaskViewModel : INotifyPropertyChanged
{
    private Task _task;
    public Task Task
    {
        get
        {
            return _task;
        }
        set
        {
            if (_task != value)
            {
                _task = value;
                RaisePropertyChanged("Task");
            }
        }
    }

    // INotifyPropertyChanged implementation
}

Dann binde ich in XAML direkt an die Modelleigenschaften, zum Beispiel:

<TextBox Text="{Binding Task.Content}" />

(TaskViewModel wäre hier der DataContext für die Ansicht).

Ich tue dies vor allem, um die von Ihnen erwähnte "Menge unnötiger Kodierung" zu vermeiden, und ich konnte keinen Nachteil feststellen. (Ich mache mein Modell auch mit EF Code-First persistent.)

3voto

K4GDW Punkte 195

Ich weiß, dass dies ein alter Thread ist, aber ich habe nach genau diesem Thema gegoogelt und bin auf diesen blogs.msdn.com Artikel gestoßen: http://bit.ly/iE3KHI

Kurz gesagt, ab CTP 4 von EF CodeFirst gibt es eine neue Eigenschaft des CodeFirst dbSet Objekts .Local. .Local ist eine ObservableCollection, die INotifyPropertyChanged implementiert. Wenn Sie also einen CodeFirst dbcontext haben, der ein DbSet(Of Task) namens Tasks bereitstellt, können Sie Ihren Formulardatenkontext auf Tasks.Local setzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X