私はVisual Studio 2015でMVVM Lightを使用してWPFアプリケーションを作成しています。コードにわずかなバリエーションを4回繰り返してコード内に繰り返す方法があります。唯一の違いは、ObservableCollection
のタイプが変更されており、データサービスレイヤーで呼び出されたメソッドです。異なるタイプで再利用可能なメソッドを作成する方法
ObservableCollection
のStatusViewModel
オブジェクトを返します。このオブジェクトは、ComboBox
のデータを格納するために使用されます。 StatusVm
がComboBox
のSelectedItem
に結合するために使用され、コレクション内の最初の項目として設定し、「ブランク」です。
private async Task<ObservableCollection<StatusViewModel>> GetStatuses()
{
var result = new ObservableCollection<StatusViewModel>();
var blank = new StatusViewModel
{
StatusId = -1,
Status = null,
Description = null,
IsActive = false,
CreatedDate = DateTime.Now
};
result.Add(blank);
var dataService = new MyDataService();
foreach (var c in await dataService.GetStatuses())
result.Add(c);
StatusVm =
result.SingleOrDefault(c => c.StatusId.Equals(-1));
return result;
}
はここStatusVm
のためのプライベートフィールドとパブリックプロパティです:
private StatusViewModel _statusVm;
public StatusViewModel StatusVm
{
get { return _statusVm; }
set
{
if (Equals(value, _statusVm)) return;
_statusVm = value;
RaisePropertyChanged();
}
}
ここで3回以上、3つ以上のVMタイプを使って上記を繰り返したとします。 GetStatuses()
を、異なるビューモデルタイプを取り、データサービスで適切なメソッドを呼び出す方法にするにはどうすればよいですか?ありがとうございました。
更新は:ここでは、種類の別のプロパティとメソッドです:
private MroViewModel_mroVm;
public MroViewModel MroVm
{
get { return _mroVm; }
set
{
if (Equals(value, _mroVm)) return;
_mroVm = value;
RaisePropertyChanged();
}
}
private async Task<ObservableCollection<MroViewModel>> GetMro()
{
var result = new ObservableCollection<MroViewModel>();
var blank = new MroViewModel
{
StatusId = -1,
Status = null,
Description = null,
IsActive = false,
CreatedDate = DateTime.Now
};
result.Add(blank);
var dataService = new MyDataService();
foreach (var c in await dataService.GetMro())
result.Add(c);
MroVm =
result.SingleOrDefault(c => c.StatusId.Equals(-1));
return result;
}
'GetStatuses()'を一般化する際の2つの問題は、 'blank'の初期化と' GetStatuses() 'Webメソッドの呼び出しです。前者は、ビューモデルを適切に初期化する必要があるか、実用的でない場合は、空のインスタンスを返すインタフェースを実装するように要求することによって処理します。次に、呼び出し側がWebメソッドを呼び出すラムダを渡すか、ViewModelに 'CallWebMethod()'メソッドを提供する必要があるかもしれません。または、私は上記のインターフェイスに追加します。それを 'IWebMethodRetrievable'などと呼びます。インターフェイスの考え方が私の成長しています。 –
ありがとう、@エイドパルケッツ。 Webメソッド呼び出しのラムダの例は何ですか? – Alex
ジェネリックメソッドについてlile private asyncタスク>すべてのタイプが同じプロパティを持つ場合、GetStatuses(T t)? –
Ian