コードを最初に表示させてください。MVVMを使用したSilverlight 4 + 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());
}
}
この時間メッセージボックスがデシベルで3つのレコードがあるので、良いである、3が表示されます。したがって、ViewとViewModelの間に問題があるように見えます。私はここでかなり基本的なものがないと思う。また、私はこれが真のMVVMではないことを知っていることに注意してください、しかし、私はこの方法でこのプログラムを達成しなければなりません。 私の説明がはっきりしていることを願っています。ご協力いただきありがとうございます。
あなたは正しいです。vvm.GetAllVenues()コールが終了したかどうかを判断する簡単な方法があるかどうか教えてください。または、最良のアプローチは何ですか? – rescueme
toClient_GetVenuesCompletedデリゲートの最後で発生するVenueViewModelに新しいイベントGetAllVenuesCompletedを追加します。言い換えれば、私はこのイベントをさらに進めるだろう。より簡単で良い方法については考えていません... – Pellared