让我先展示代码。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