1

リストボックスが更新/再表示されないという問題があります。使用する必要があることをここで読みましたObservableCollectionが、運がありませんでした。XMLからリストボックスにデータを入力しています。

 public class PestotoraPost
    {
        public string ID { get; set; }
        public string Date { get; set; }
        public string Name { get; set; }
        public string Message { get; set; }

    }
void WebLoad()
    {
        WebClient pestotora = new WebClient();
        pestotora.DownloadStringCompleted += new DownloadStringCompletedEventHandler(pestotora_DownloadStringCompleted);
        pestotora.DownloadStringAsync(new Uri("wwww.someURL.com/xml.php"));

    }

実際のxmlは、(SQL DBからの)xml構造を含むphpであることに注意してください。

 void pestotora_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        XElement doc = XElement.Parse(e.Result);
        listBox1.ItemsSource = from results in doc.Descendants("Data")
                            select new PestotoraPost
                            {
                                ID = results.Element("DataID").Value,
                                Date = results.Element("DataDate").Value,
                                Name=results.Element("DataName").Value,
                                Message=results.Element("DataMessage").Value     
                            };
    }

XMLが変更されるたびに、リストボックスは更新されません。listBox1.UpdateLayout();

これを実装し始める方法についての手がかり/ヘルプはありますか?どうもありがとうございます。

更新しました

namespace pestotora
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
            UIload(true);
            WebLoad();

        }

        public ObservableCollection<PestotoraPost> Posts { get; set; }

        public class PestotoraPost
        {
            public string ID { get; set; }
            public string Date { get; set; }
            public string Name { get; set; }
            public string Message { get; set; }
        }


        void WebLoad()
        {

            WebClient pestotora = new WebClient();
            pestotora.DownloadStringCompleted += new DownloadStringCompletedEventHandler(pestotora_DownloadStringCompleted);
            pestotora.DownloadStringAsync(new Uri("www.domain.com/xml.php"));

        }

        void UIload(bool Splash)
        {
            if (Splash == true)
            {

                ApplicationBar.IsVisible = false;
            }
            else
            {

                ApplicationBar.IsVisible = true;
            }
        }

        void pestotora_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            //XDocument doc = XDocument.Parse(e.Result);

            XElement doc = XElement.Parse(e.Result);


            /* listBox1.ItemsSource = from results in doc.Descendants("Data")
                                select new PestotoraPost
                                {
                                    ID = results.Element("DataID").Value,
                                    Date = results.Element("DataDate").Value,
                                    Name=results.Element("DataName").Value,
                                    Message=results.Element("DataMessage").Value

                                }; */
            var list = from results in doc.Descendants("Data")
                       select new PestotoraPost
                       {
                           ID = results.Element("DataID").Value,
                           Date = results.Element("DataDate").Value,
                           Name = results.Element("DataName").Value,
                           Message = results.Element("DataMessage").Value
                       };
            Posts = new ObservableCollection<PestotoraPost>(list);
            foreach (var post in list)
            {
                Posts.Add(post);
            }

            UIload(false);


        }


        private void ApplicationBarMenuItem_Click(object sender, EventArgs e)
        {
            //stckPost.Visibility = System.Windows.Visibility.Visible;

        }



        private void ApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            NavigationService.Navigate(new Uri("/Post.xaml", UriKind.Relative));
        }

        private void ApplicationBarIconButton_Click_1(object sender, EventArgs e)
        {

            listBox1.UpdateLayout();
            //listBox1.ScrollIntoView(listBox1.Items[0]);

            WebLoad();
        }

    }

}
4

1 に答える 1

0

1. MVVMパターンを使用する場合:viewModelでINotifyPropertyChangedを実装し、次のように宣言します。

private ObservableCollection<PestotoraPost> _posts;
public ObservableCollection<PestotoraPost> Posts 
{
 get{return _posts;} 
 set
  {
     _posts = value;
     RaisePropertyChanged("Posts");
  }
 }

xamlで書き込み:

<ListBox Name="listbox1" ItemsSource="{Binding Posts}"/>

pestotora_DownloadStringCompletedメソッドの場合:

var list = from results in doc.Descendants("Data")
                            select new PestotoraPost
                            {
                                ID = results.Element("DataID").Value,
                                Date = results.Element("DataDate").Value,
                                Name=results.Element("DataName").Value,
                                Message=results.Element("DataMessage").Value     
                            };
Posts = new ObservableCollection<PestotoraPosts>(list);

2.すべてをコードビハインドで実行する場合は、宣言するだけです

 public ObservableCollection<PestotoraPosts> Posts {get;set;}

そして、Pageコンストラクターのinitコレクションでは:

 Posts = new ObservableCollection<PestotoraPosts>();

Xamlにも同じ宣言があります。そしてpestotora_DownloadStringCompleted方法で:

var list = from results in doc.Descendants("Data")
                            select new PestotoraPost
                            {
                                ID = results.Element("DataID").Value,
                                Date = results.Element("DataDate").Value,
                                Name=results.Element("DataName").Value,
                                Message=results.Element("DataMessage").Value     
                            };
foreach(var post in list)
{
   Posts.Add(post);
}

私たちは何をしましたか?

xamlでは、データバインディングを設定します。これで、コレクションlistBox1からデータを取得します。Post次に、新しいコレクションを作成し、そのlistBox1ビューを更新するように通知しました。(最初のvatiantで)。

2番目のバリアントでは、コレクションにデータを入力し、観察可能であるため、リストボックスに通知しました。

于 2012-09-11T17:47:11.170 に答える