2012-07-21 188 views
1

我一直在關注this tutorial以嘗試理解XML,WPF和C#(從Fortran出來)。我已經得到了功能的工作(感謝教程),但我有麻煩修改它與WPF,而不是WinForms。將ObservableCollection綁定到ListView

從本質上講,當我點擊 「獲取RSS」 按鈕,正在發生以下:

RssManager reader = new RSSManager(); 
ObservableCollection<Rss.Items> _list = new ObservableCollection<Rss.Items>(); 
reader.Url = txtFeed.Text; 
reader.GetFeed(); 
_list = (ObservableCollection<Rss.Items>)reader.RssItems; 

ListView控件只是坐在空白。它的代碼如下所示。此外,與類名的列表框結果嘗試這種被填充在列表,而不是我的數據的每個項目:

<ListView ItemsSource="_rssItems"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn DisplayMemberBinding="{Binding Title}"/> 
     </GridView> 
    </ListView.View> 
</ListView> 

有沒有可能像做(再次,原諒我的無知這裏):

_list.Add(new Rss.Items()); 

名單(_list)包含了所有的信息,我需要,我只是想弄清楚如何正確地綁定它(或將其添加)到ListView。

+0

您綁定到_rssItems,但將其存儲在_list中?從我看到的我會認爲你的ItemsSource應該是{Binding _list}。 – 2012-07-21 22:45:26

回答

1

看起來你有點迷路。

最終,您希望將視圖(WPF表單)綁定到視圖模型,並將視圖模型綁定到模型(RSSManager)。

現在讓我們直接將視圖綁定到模型上。

在您的構造函數中,您創建了一個新的模型實例,並將其分配給數據上下文。

這個模型是怎麼回事,只要生活的形式 -

public MainWindow() 
    { 
     InitializeComponent(); 
     _model = new RssManager(); 
     DataContext = _model; 

    } 

然後在你的XAML你的項目源綁定到您的收藏屬性:在「路徑

 <ListView ItemsSource="{Binding Path=RssItems}"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn DisplayMemberBinding="{Binding Title}"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 

注意= RssItems「與您分配給DataContext的任何內容有關。

然後在你的刷新按鈕邏輯調用:

_model.Url = txtFeed.Text; 
_model.GetFeed(); 

什麼,你最終要的做的就是把另一個層在中間。這是視圖模型。視圖模型就像您可能已經猜到了視圖的模型一樣。

視圖模型的工作是收集有關視圖狀態的信息,並公開要由視圖呈現的模型中的數據。它也可以保存當前的用戶狀態信息 - f.e.表中的哪一行被選中,因爲某些命令可能會稍後執行。實質上,它允許從代碼中抽象出視圖的所有邏輯。無論選擇哪種類型的控件,您的命令都可以在選擇哪一行的情況下進行操作。

0

正如李建議在他的評論中,ListView的ItemsSource屬性的綁定看起來不正確。有多種方法可以解決這個問題,這取決於你的項目是如何設計/結構化的。

爲了DataBind,ListView將需要某種DataContext(顧名思義)是Binding的Context的一種。如果您使用的是MVVM,那麼很可能,整個Window/Control的DataContext將是ViewModel。在這種情況下,綁定到這樣的視圖模型的屬性:

<ListView ItemsSource="{Binding RssItems}">...</ListView> 

這裏假設你有一個公共的RSSItems屬性視圖模型(這是某種形式的名單/可枚舉)和視圖模型是DataContext的。

如果您不使用MVVM,有很多方法可以使用DataBinding和不使用DataBinding來分配ItemsSource。我建議,如果你不與數據綁定完全舒適的最簡單的方法,將是手動分配的ItemsSource,就像這樣:

XAML中:在UI加載代碼後面(後某處

<ListView x:Name="MyRssList">...</ListView> 

並且在創建/填充_list後):

MyRssList.ItemsSource = _list; 

這不使用DataBinding,但它會完成工作。如果你想與數據綁定開始時,你可以做到以下幾點:

XAML:

<ListView x:Name="MyRssList" ItemsSource="{Binding}>...</ListView> 

代碼背後:

MyRssList.DataContext = _list; 

這將列表指定爲ListView控件的DataContext的,然後DataBind ItemsSource屬性到DataContext。總體而言,您正處在正確的軌道上。我建議您閱讀DataBindingMVVM。 MVVM是利用WPF強大的DataBinding功能的一種非常好的方式,對DataBinding的深入理解對於設計和構建優秀的WPF應用程序非常有價值。

希望這會有所幫助。祝你好運!

相關問題