-1

これらの2つのプロパティを持つモデルビューモデルがたくさんあることを思い出しました

public Visibility OkButtonVisibility
{
get{  return _OkButtonVisibility;}
set{ 
_OkButtonVisibility = value;
RaisePropertyChanged("OkButtonVisibility");
}

}

public Visibility CancelButtonVisibility
{
get{  return _CancelButtonVisibility;}
set{ 
_CancelButtonVisibility = value;
RaisePropertyChanged("CancelButtonVisibility");
}

}

私は次のようにそれらのために取り付け可能なインターフェースを作成したかった:

Interface IOKandCancelButtonsVM
{
 public Visibility OkButtonVisibility
{
get{  return _OkButtonVisibility;}
set{ 
_OkButtonVisibility = value;
RaisePropertyChanged("OkButtonVisibility");
}

}

public Visibility CancelButtonVisibility
{
get{  return _CancelButtonVisibility;}
set{ 
_CancelButtonVisibility = value;
RaisePropertyChanged("CancelButtonVisibility");
}

}

これを使用してそれらを継承するビューモデルと、このようなプロキシプロパティを持つ別のインターフェースがあります

class VM1:BaseVM,IOKandCancelButtonsVM,IOtherCommonPropertyVM
{ 

} 

しかし、その後、新しいインターフェイスが実装されていないことを明らかにしましたINotifyChangedIOKandCancelButtonsVM含意INotifyChanged を持ち、VM1明示的に含意するのは悪い考えBaseVMでしょうか?

同じインターフェイスを2回継承するクラスを扱ったことはなく、どうすればよいかわかりません。

これはほんの一例に過ぎず、私が数百のプロパティを持っている VM を使用している VM は半分にも満たず、その多くは数十の画面を共有しています。すべてを BaseViewModel に貼り付けるよりも洗練されたソリューションが必要です

4

4 に答える 4

2

インターフェイス定義に実装を含めることはできません。これは、IOKandCancelButtonsVM定義が正しくないことを意味します。

IOKandCancelButtonsVMにBaseVMを実装させるのは悪い考えです

はい、それは非常に悪い考えです-実際には不可能です-インターフェースはクラスを実装または拡張できません。

コードを構造化する方法について意見を求めたので、これも捨てます。ビューモデルから「可視性」への参照を削除します。ビューモデルからSystem.Visibility値を返さないでください。

ビューモデルはビューについて何も知らないはずです。これを行うための意味的に正しい方法は、ビューモデルからフラグを返すだけで、コンバーターを使用してバインディング内のVisibility値に変更することです。これを行うためのフレームワークには既製のコンバーターもあります:BooleanToVisibilityConverter。ブール値を返している場合でも、VMでUI関連の用語について言及しないようにしてください。これは、より厳密で統制のとれたコードにつながる良い方法です。これらの名前を使用すると、最終的には臭いコードになります。

プロパティ変更通知への優れたアプローチを説明するブログ投稿があります:MVVMでのプロパティ通知の合理化

明確にするために、インターフェイスに関するアイデアをすべて取り除くことをお勧めします。必ずIOKandCancelButtonsVM、OK/キャンセルでダイアログにバインドされる他の多くのビューモデルによって拡張されるベースビューモデルに単純なブールプロパティを含めてくださいボタン。

これをテキストで図解すると、次のようになります。

YourBaseVm < -BaseVmUsedByDialogs < -SpecificDialogVm

(クラスが抽象であることを示すイタリック体に注意してください)

于 2012-07-01T07:56:53.337 に答える
1

virtual propertiesデフォルトの機能が実装された基本クラス BaseVM を選択しない理由はありません。他の派生クラスがそれを拡張したい場合は、必要な機能ごとにいつでもオーバーライドできます。

BaseVM が実装していることを確認してくださいINotifyPropertyChanged

于 2012-07-01T08:04:35.813 に答える
1

すでに基本ビューモデル クラスがあるようです。そこに 2 つのプロパティを追加するだけです。これらの 2 つのプロパティが必要な場合に使用する、最初のベースから継承する 2 番目のベースを作成することをお勧めします。

于 2012-07-01T07:29:50.453 に答える
0

抽象基本クラスを作成し、それらのプロパティを必要とするViewModelに継承させます。単純にする。

abstract class BaseDialogVM : BaseVM
{
    private Visibility _OkButtonVisibility;
    public Visibility OkButtonVisibility {
        get { return _OkButtonVisibility; }
        set { 
           _OkButtonVisibility = value;
           RaisePropertyChanged("OkButtonVisibility");
        }
    }

    private Visibility _CancelButtonVisibility;
    public Visibility CancelButtonVisibility {
        get { return _CancelButtonVisibility; }
        set { 
           _CancelButtonVisibility = value;
           RaisePropertyChanged("CancelButtonVisibility");
        }
    }
}

class VM1 : BaseDialogVM { /*...*/ }
于 2012-07-02T05:26:59.620 に答える