2

おそらくNoobの質問。マップにサロンの画鋲が表示されているmvmwp7アプリを開発しています。データベースはリンクから取得されます。

私が苦労している問題は、監視可能なコレクションデータがApp._ViewModelからロードされていないことです(jsonシリアライザーがデータベースを解析して正常に動作します)。デバッグ時に、アプリはプレーンマップを表示します。データベースから文字列属性を返すと、そのコードが中断されます。文字列を表示するためにメッセージボックスも試しましたが、それでもクラッシュします。

コードは次のとおりです。

mainviewmodel.cs

public class MainViewModel {
public bool IsDataLoaded {get; プライベートセット; }

    public ObservableCollection<SalonViewModel> SalonCollection { get; private set; }


    public MainViewModel()
    {
        IsDataLoaded = false; 
    }

    public ObservableCollection<SalonViewModel> LoadData()
    {
        SalonCollection = new ObservableCollection<SalonViewModel>();
        var wednesday = new Uri("http://blehbleh.txt");
        WebClient wc = new WebClient();
        wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
        wc.OpenReadAsync(wednesday);

        return SalonCollection;
    }

    public void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    { 
        try
        { 
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ObservableCollection<SalonViewModel>));
            ObservableCollection<SalonViewModel> list = serializer.ReadObject(e.Result) as ObservableCollection<SalonViewModel>;

            foreach (SalonViewModel b in list)
            { 
               SalonCollection.Add(new SalonViewModel { sid=b.sid,sname=b.sname,sgeo_lat=b.sgeo_lat,sgeo_lon=b.sgeo_lon, 

            }

            this.IsDataLoaded = true;

        }
        catch (Exception ex)
        {
            //throw ex;
            MessageBox.Show(ex.Message);
        }
    }

App.cs

パブリック部分クラスアプリ:アプリケーション{

    private static MainViewModel viewModel;

    public static MainViewModel _viewModel
    { 
        get
        {
            if (viewModel == null)
            {
                viewModel = new MainViewModel();
            }

            return viewModel;
        }
    }

    void LoadData()
    {
        if (!_viewModel.IsDataLoaded)
        {
            _viewModel.LoadData();
        }
    }

これがmappage.csです

private voidsalon_map_Loaded(オブジェクト送信者、RoutedEventArgs e){

             foreach (SalonViewModel Salon in App._viewModel.LoadData)
             {
                 MessageBox.Show(Salon.sname);
                 Pushpin p = new Pushpin();
                 p.Content = Salon.sname + System.Environment.NewLine + "Rate: "; 
                 Layer.AddChild(p, new GeoCoordinate(Salon.sgeo_lon, Salon.sgeo_lat)); 
             }

             Map1.Children.Add(Layer); 

         }
4

1 に答える 1

1

あなたのMainViewModel LoadData関数でOpenReadAsync()は、は非同期関数です。したがって、コールバック関数はまだ実行されていないためSalonCollection、次の行に戻ると空のが返されます。ObservableCollectionwc_OpenReadCompleted

また、MessageBox.Showクラッシュする理由は、UI以外のスレッドでUI関数を呼び出そうとしているためです(これに対する解決策:Windows Phone 7のDispatcher.Invoke()?

を返し、ObservableCollectionそこから手動で子をマップに追加する代わりに、のMapItemsControlレイヤーをビューモデルのにバインドしてみてくださいMapObservableCollectionここにそれを行う適切な例があります:WindowsPhoneのBingマップへの画鋲のバインド

于 2012-11-06T01:43:15.313 に答える