Я использую MVVM Light в Visual Studio 2015 для создания WPF-приложения. В коде есть метод, который повторяется с небольшим изменением в коде 4 раза; единственное различие заключается в изменении типа ObservableCollection
и способа, вызываемого на уровне службы данных.Как сделать метод многоразовым с разными типами
Вот метод, который возвращает ObservableCollection
объектов StatusViewModel
, которые используются для заполнения ComboBox
; StatusVm
используется для связывания с SelectedItem
в ComboBox
, устанавливается в качестве первого элемента в коллекции и «пустым»:
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()
в методе, который может принимать разные типы моделей вида и вызвать соответствующий метод в службе данных? Спасибо.
Update: Вот свойство и метод для других типов:
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()' являются инициализацией 'blank' и вызовом веб-метода' GetStatuses() '. Первое, что я хотел бы обработать, либо потребовав, чтобы модели viewmodels были инициализированы соответствующим образом, или если это нецелесообразно, потребовав от них реализовать интерфейс, который возвращает экземпляр 'blank'. Затем может потребоваться, чтобы вызывающие абоненты передавали в лямбда, которая вызывает веб-метод, или требуют, чтобы модели просмотра предоставляли метод «CallWebMethod()». Или добавьте это в интерфейс, о котором я упоминал выше. Назовите его 'IWebMethodRetrievable' или некоторые из них. Идея интерфейса растет на меня. –
Спасибо, @EdPlunkett. Какой пример лямбды для вызова веб-метода? – Alex
Как получить общий метод lile private async Задача> GetStatuses (T t), если все типы имеют одинаковые свойства? –
Ian