Tôi có một mô hình khung nhìn với một hàm tạo yêu cầu dịch vụ. Tôi đang sử dụng MvvmLight của GalaSoft trong đó sử dụng một định vị dịch vụ để kết nối khung nhìn với mô hình khung nhìn.Mô hình xem MVVM và khởi tạo dữ liệu không đồng bộ
SimpleIOC xử lý việc cung cấp dịch vụ cho trình tạo mô hình chế độ xem tốt, nhưng bằng cách nào đó tôi cần điền mô hình chế độ xem của mình với dữ liệu từ nguồn dữ liệu. My Viewmodel trông giống như sau: -
public class MainPageViewModel : ViewModelBase
{
private readonly GroupService _groupService;
private readonly GroupFactory _groupFactory;
private readonly ObservableCollection<GroupVM> _groupVms = new ObservableCollection<GroupVM>();
public MainPageViewModel(Domain.Services.GroupService groupService, VMFactories.GroupFactory groupFactory)
{
_groupService = groupService;
_groupFactory = groupFactory;
}
public async Task Init()
{
var groups = await _groupService.LoadGroups();
foreach (var group in groups)
{
GroupVms.Add(_groupFactory.Create(group));
}
}
public ObservableCollection<GroupVM> GroupVms { get { return _groupVms; } }
}
Bằng cách nào đó phương pháp init cần được gọi là chờ đợi, nhưng tôi không biết cách tốt nhất để làm điều này? Tôi có thể nghĩ đến ba lựa chọn: -
- tôi chỉ cần gọi Init trên các nhà xây dựng, nhưng không phải chờ đợi nó (Tôi biết thats thực hành thực sự xấu)
- tôi gọi Init trên đối tượng ViewModelLocator, nhưng kể từ khi tôi không thể trả lại một nhiệm vụ Tôi lại không thể chờ đợi init
- Khi tải của chế độ xem, tôi truyền DataContext tới một số loại IAsyncViewmodel và chờ phương thức init.
Tôi đã sử dụng tùy chọn 3 trong dự án cửa sổ trước 8 cửa hàng nhưng nó chỉ cảm thấy sai. Bất kỳ lời khuyên nào sẽ được đánh giá cao!
Cảm ơn
Ross
Điểm tốt, đó là "một trong những" điều tôi đã thực hiện nhưng không thực sự nghĩ đến. Ở đây có thêm một chút thông tin về: http://stackoverflow.com/questions/7261173/c-sharp-start-async-method-within-object-constructor-bad-practice Về cơ bản đó là vì khi đối tượng được xây dựng thì nó vẫn là " làm công cụ "có lẽ bất ngờ, cộng thêm rất khó để xử lý các ngoại lệ có thể xảy ra. Tôi đã thử cả hai cách, và tôi nghĩ rằng tôi thích init trong constructor, nhưng vẫn không chắc chắn! –
mẹo: để tránh 'squigglies' trong Visual Studio chỉ cần gán giá trị của tác vụ trả về cho biến giả –