5

モデルをすべてWPFアプリケーション用にセットアップし、最初にエンティティフレームワークのctp5コードを操作します。次に、サンプルモデルクラスを示します。

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; }
}

ビューモデルを構築するための推奨される方法は何ですか?私のビューモデルはINotifyPropertyChangedを実装しますが、モデルクラスにUI固有のコードを持たせたくないので、他のアプリで簡単に再利用できます。すべてのモデルプロパティを仮想にしてから、ビューモデルでそれらをオーバーライドする必要がありますか?(多くの不要なコーディングのようです...)EFコードは、最初にこのタイプのフォーマットでうまく機能しますか?

編集 これはやや似た質問ですMVVMでは、ViewModelまたはModelはINotifyPropertyChangedを実装する必要がありますか? ただし、唯一の解決策は、UIロジックであると私が考えるものをモデルに追加することであるように見えます。おそらく、ある種のデリゲートをモデルに追加し、ビューモデルからそれにフックすることができます。これにより、INotifyPropertyChangedが使用されます...このようなものですか?

    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");
                }
            }
        }
...
4

2 に答える 2

4

私が行っているのは、モデルクラスのインスタンスをViewModelのプロパティに作成してからINotifyPropertyChanged、Modelプロパティの場合はModelに直接実装し、Modelインスタンスの場合はViewModelにのみ実装することです。

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
}

次に、XAMLでモデルプロパティに直接バインドします。たとえば、次のようになります。

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

(TaskViewModelは、ここではビューのDataContextになります。)

私は主にあなたが言うこの「たくさんの不必要なコーディング」を避けるためにこれをします、そして私は欠点を見つけることができませんでした。(私はモデルをEFコードファーストで永続化します。)

于 2011-02-21T18:00:45.183 に答える
3

これが古いスレッドであることは知っていますが、私はこのトピックについてグーグルで調べていて、このblogs.msdn.comの記事に出くわしました:http: //bit.ly/iE3KHI

つまり、EFCodeFirstのCTP4から、CodeFirstdbSetオブジェクト.Localの新しいプロパティがあります。.Localは、INotifyPropertyChangedを実装するObservableCollectionです。したがって、Tasksという名前のDbSet(Of Task)を公開するコードファーストのdbcontextがある場合は、フォームのデータコンテキストをTasks.Localに設定できます。

于 2011-05-24T20:26:34.527 に答える