1

私はWindowsPhoneの開発に足を踏み入れており、WP上のSilverlightの機能のいくつかに慣れ始めていますが、XMLに苦労しています。

いくつかのオブジェクトをXMLにシリアル化してから、そのXMLを読み取って、オブジェクトに再度シリアル化しようとしています。次に、それを使用して、リストボックスのObservableCollectionとしてを配置することにより、リストボックスにデータを入力しますItemsSource

データバインディングが正しく機能することはすでに確認しました。オブジェクトを生成してにObservable Collection入れてから、として入れればItemsSource問題ありません。障害があるのは私のコードのXML部分のようです。すべてが十分にコンパイルおよび実行されますが、リストボックスは空のままです:(

このコードは、アプリの起動時に実行されます(あまり効果的ではありませんが、私のテストでは機能します)。

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
    {
        ObservableCollection<Quote> quotes = new ObservableCollection<Quote>();
        for (int i = 0; i < 10; i++)
        {
            Quote quote = new Quote()
            {
                Author = "Author #" + i.ToString(),
                QuoteText = "This is quote #" + i.ToString(),
            };

            quotes.Add(quote);
        }

        XmlWriterSettings xmlwrtrstngs = new XmlWriterSettings();
        xmlwrtrstngs.Indent = true;
        using(IsolatedStorageFile isostrg = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using(IsolatedStorageFileStream isoflstrm = isostrg.OpenFile("Quotes.xml", FileMode.Create))
            {
                XmlSerializer xmlsrlzr = new XmlSerializer(typeof(QuoteCollection));
                using(XmlWriter xmlwrtr = XmlWriter.Create(isoflstrm, xmlwrtrstngs))
                {
                    xmlsrlzr.Serialize(xmlwrtr, quoteCollection);
                }
            }
        }

        loadData();
    }

    void loadData()
    {
        try
        {
            using(IsolatedStorageFile isostrg = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using(IsolatedStorageFileStream isoflstrm = isostrg.OpenFile("Quotes.xml", FileMode.Open))
                {
                    XmlSerializer xmlsrlzr = new XmlSerializer(typeof(QuoteCollection));
                    QuoteCollection quoteCollectionFromXML = (QuoteCollection)xmlsrlzr.Deserialize(isoflstrm);
                    LstBx.ItemsSource = quoteCollectionFromXML.Quotes;
                }
            }
        }
        catch(Exception)
        {

            Console.Write("Something went wrong with the XML!");
        }


    }

QuoteCollection

public class QuoteCollection : INotifyPropertyChanged
{
    ObservableCollection<Quote> quotes;
    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<Quote> Quotes
    {
        get { return quotes; }

        set
        {
            if(quotes != value)
            {
                quotes = value;
                raisePropertyChanged("Quotes");
            }
        }
    }

    protected virtual void raisePropertyChanged(string argPropertyChanged)
    {
        if(PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(argPropertyChanged));
        }
    }
}

引用

public class Quote : INotifyPropertyChanged
{
    string author;
    string quoteText;
    public event PropertyChangedEventHandler PropertyChanged;

    public string Author
    {
        get
        {
            return author;
        }

        set
        {
            if(author != value)
            {
                author = value;
                onPropertyChanged("Author");
            }
        }
    }

    public string QuoteText
    {
        get
        {
            return quoteText;
        }

        set
        {
            if(quoteText != value)
            {
                quoteText = value;
                onPropertyChanged("QuoteText");
            }
        }
    }

    protected virtual void onPropertyChanged(string argProperty)
    {
        if(PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(argProperty));
        }
    }
}

どんな洞察も大歓迎です:)

4

2 に答える 2

2

タイプとして使用してシリアライズしていますがQuoteCollection、実際にはObservableCollection<Quote>.

于 2012-06-03T14:56:21.170 に答える
0

以前に作成したQuoteCollectionインスタンスにObservableCollectionを配置するのを忘れました(投稿されたコードには表示されていません)。

于 2012-06-01T14:41:57.503 に答える