讓我先展示代碼。Silverlight 4 +帶MVVM的WCF:收集不會因爲某種原因而被填充
WCF的ServiceContract功能:
public List<VenueData> GetVenues()
{
List<VenueData> listOfVenues = new List<VenueData>();
string connString = @"....";
DataContext dc = new DataContext(connString);
Table<VenueData> venues = dc.GetTable<VenueData>();
listOfVenues = (from v in venues
select v).ToList();
return listOfVenues;
}
VenueViewModel.cs
public class VenueViewModel : ViewModelBase
{
private VenueData _venue;
private ObservableCollection<VenueData> _venues = new ObservableCollection<VenueData>();
public VenueData Venue
{
get
{
return _venue;
}
set
{
if (_venue != value)
{
_venue = value;
OnNotifyPropertyChanged("Venue");
}
}
}
public ObservableCollection<VenueData> Venues
{
get
{
return _venues;
}
set
{
if (_venues != value)
{
_venues = value;
OnNotifyPropertyChanged("Venues");
}
}
}
public void GetAllVenues()
{
TicketOrderWcfClient toClient = new TicketOrderWcfClient();
toClient.GetVenuesCompleted += new EventHandler<GetVenuesCompletedEventArgs>(toClient_GetVenuesCompleted);
toClient.GetVenuesAsync();
}
void toClient_GetVenuesCompleted(object sender, GetVenuesCompletedEventArgs e)
{
if (e.Error == null)
Venues = e.Result;
}
}
MainPage.xaml中(視圖)
public MainPage()
{
InitializeComponent();
Loaded += new RoutedEventHandler(MainPage_Loaded);
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
VenueViewModel vvm = new VenueViewModel();
vvm.GetAllVenues();
MessageBox.Show(vvm.Venues.Count.ToString());
}
嗯,這是大部分的代碼。問題是在MainPage_Loaded事件中,vvm.GetAllVenues()不會填充Venues ObservableCollection。 MessageBox將顯示0.我測試了wcf服務是好的,也提琴手顯示肥皂罰款。此外,如果我在MainPage_Loaded事件中調用wcf服務,那麼它將起作用。見下圖:
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
TicketOrderWcfClient toClient = new TicketOrderWcfClient();
toClient.GetVenuesCompleted += new EventHandler<GetVenuesCompletedEventArgs>(toClient_GetVenuesCompleted);
toClient.GetVenuesAsync();
}
void toClient_GetVenuesCompleted(object sender, GetVenuesCompletedEventArgs e)
{
if(e.Error == null)
{
VenueViewModel vvm = new VenueViewModel();
vvm.Venues = e.Result;
MessageBox.Show(vvm.Venues.Count.ToString());
}
}
這次MessageBox會顯示3,這很好,因爲db中有3條記錄。所以它看起來像View和ViewModel之間存在問題。我懷疑我在這裏錯過了一件非常基本的事情。另外請注意,我知道這不是真正的MVVM,但我必須通過這種方式來完成這個程序。 我希望我的解釋清楚,謝謝你的幫助。
你說得對。你能告訴我是否有一個簡單的方法來決定vvm.GetAllVenues()調用是否完成?或者什麼是最好的方法? – rescueme
通過在VenueViewModel中添加一個新事件GetAllVenuesCompleted,該事件將在toClient_GetVenuesCompleted委託的最後被觸發。換句話說,我會進一步傳遞這個事件。不知道更簡單更好的方法... – Pellared