0

私は rssreader をコーディングしようとしていますが、いくつかのアーキテクチャのヒントをいただければ幸いです。私のリーダーのメイン ウィンドウは、フレームに読み込まれる 2 つの wpf ページをホストします。これは、ユーザーが異なる RSS プロバイダーを選択できる「ボトムバー」です。メイン フレーム (またはページ) には私のリストビューがあります。ローディング アニメーションと UI フリーズのため、監視可能なコレクションに RSS データを入力するバックグラウンド ワーカーを持つ追加のクラスがあり、デバッグ時にコレクションが正しく入力されます。メインページで、データコンテキストをこの観察可能なコレクションに設定していますが、リストビューには何も表示されません。ここで立ち往生しています。

それが私が持っているものです:

メインページ XAML:

> <ListBox ItemsSource="{Binding}" DisplayMemberPath="RssTitle"
> IsSynchronizedWithCurrentItem="True"
> SelectionChanged="itemsList_SelectionChanged"
> ItemContainerStyle="{DynamicResource listboxitem_style}" Height="396"
> HorizontalAlignment="Left" Margin="126,12,0,0" Name="ListBox1"
> VerticalAlignment="Top" Width="710"></ListBox>

ListBox1.DataContext = GetRssItems.observable_list;

別の RSS フィードを取得するためのボトムページ:

GetRssItems getitems = new GetRssItems();
GetRssItems.observable_collection = null;
getitems.start_bg_worker("url");

GetRssItems.cs

public class GetRssItems
    {
        public static ObservableCollection<RSSItem> observable_collection { get; set; }
        public static string tmp_url;
        public BackgroundWorker worker = new BackgroundWorker();


        public void start_bg_worker(string url)
        {


            if (!worker.IsBusy)
            {

                worker.DoWork += new DoWorkEventHandler(worker_DoWork);
                worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
                worker.RunWorkerAsync(url);
            }
        }
}

BackgroundWorkers DoWork では、linq を使用して rss アイテムを受け取り、監視可能なコレクションに追加します。

  observable_collection.Add(new RSSItem(item.tmp_Title, item.tmp_Link, item.tmp_Description, item.tmp_pubDate, item.tmp_ImageUrl));

別のクラス RSSItem.cs

public class RSSItem
    {
         public string RssTitle { get; set; }
            public string RssLink { get; set; }
            public string RssDescription { get; set; }
            public string RsspubDate { get; set; }
            public string RssImageUrl { get; set; }

            public RSSItem(string rsstitle, string rsslink, string rssdescription, string rsspubdate, string rssimageurl)
            {
                RssTitle = rsstitle;
                RssLink = rsslink;
                RssDescription = rssdescription;
                RsspubDate = rsspubdate;
                RssImageUrl = rssimageurl;
            }
    }

お時間とヒントをありがとう。よろしくお願いします

4

2 に答える 2

2

WPF を最大限に活用するには、MVVM を少し読む必要があります。リストボックスのデータコンテキストを設定する行はかなり混乱しています。

必要なのは、監視可能なコレクションを含むビュー モデル クラスに設定されたメイン ウィンドウ (xaml) のデータ コンテキストです。リスト ボックスの ItemsSource は、そのプロパティ名に設定されます。

例えば:

public class MainViewModel : INotifyPropertyChanged
{
   public ObservableCollection<RSSItem> RSSItems
   {
      get;
      set;
   }
   // Other stuff applicable to the main window.
}

ビューが構築されたら、MainViewModel のインスタンスをその DataContext に渡します。次に、ListBox の Xaml は次のようになります。

<ListBox ItemsSource={Binding Path=RSSItems} ... />

RSSItems コレクション インスタンス (つまり、パブリック セッター) を設定/変更できるようにする場合は、NotifyPropertyChanged イベントを使用して設定する必要がありますが、アイテムを追加/削除するだけの場合、これは必要ありません。(つまり、コンストラクターでアイテムを読み込みます。)

于 2012-07-22T12:17:14.430 に答える
1

以下を使用してください: データ コンテキストはオブジェクトである必要がありますgetitems

<ListBox  ItemsSource="{Binding observable_collection}"  Height="167" Margin="0" Name="listBox1" Width="330" FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Top">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding RssTitle}"  FontWeight="Bold" FontSize="16" />
                                <TextBlock Text="{Binding RssLink}"  FontSize="16"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

PS: あなたの名前は HORRBILE です

于 2012-07-22T12:08:08.090 に答える