0

したがって、Windows 8タブレットアプリケーションには、次のプロパティを持つGridViewがあります。

    <Grid>
        <GridView ItemsSource="{Binding Source={StaticResource manager}, Path=TestStrings}" />
    </Grid>

これは、別のクラスのプロパティTestStringsにリンクしています。

public List<string> TestStrings
    {
        get
        {
            List<Location> locations = getLocations(); 

            List<string> testStrings = new List<string>();

            for (int i = 0; i < locationList.Count; i++)
            {
                testStrings.Add(locationList[i].Name);
            }

            return testStrings;
        }
    }

    public async Task<List<Location>> getLocations()
    {
        return await xmlParser.getLocations();
    }

文字列リストに値を入力して返すだけで、GridViewに値が表示されます。問題ありません。ただし、問題は、非同期メソッドを呼び出す必要があることです。私のデータのほとんどはXMLファイルから取得されます。XMLファイルにアクセスするには、ストレージからファイルをプルする必要があります。これは、私が知る限り、待つ必要があります。これがその方法です:

public async Task<List<Location>> getLocations()
    {
        StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
        StorageFile file = await storageFolder.GetFileAsync("main.xml");
        XmlDocument xmlDoc= await XmlDocument.LoadFromFileAsync(file);
        XDocument xml = XDocument.Parse(xmlDoc.GetXml());

        List<Location> locationList =
            (from _location in xml.Element("apps").Elements("app").Elements("locations").Elements("location")
             select new Location
             {
                 Name = _location.Element("name").Value,
             }).ToList();

        return locationList;
    }

ご覧のとおり、私は2回待機しているため、非同期メソッドにする必要があります。つまり、それを呼び出すすべてのメソッドは非同期である必要があります。ただし、XAMLのバインディングプロパティでは、非同期にすることのできないプロパティにアクセスする必要があります。

何かが足りないと感じています。私は最近AndroidからWindows8でプログラミングを開始するように移行したので、その多くは私にとって新しいものです。確かに、ファイルからUIにデータを表示することは一般的なタスクです。それを処理するための最良の方法は何ですか?

4

1 に答える 1

0

リストのタイプをからに変更してみて、List問題ObservableCollectionが解決するかどうかを確認してください。非同期動作の観察は的を射ています。リストを変更しても、バインディングエンジンに何かが変更されたという通知はトリガーされず、変更はしばらくしてから不明な時間に発生します。この通知は、 ObservableCollectionを使用するときに発生します。

于 2013-03-28T05:26:36.410 に答える