2011-03-07 96 views
1

從WPF開始,我仍然在努力理解數據綁定功能。WPF綁定列表到多列列表框

我試圖使用多列列表框和我的XAML看起來像這樣:

<ListBox Name="RecordList"> 
    <ListView Name="RecordListView"> 
     <ListView.View> 
      <GridView> 
       <GridView.Columns> 
        <GridViewColumn Header="1" Width="Auto" DisplayMemberBinding="{Binding Path=Field1}" /> 
        <GridViewColumn Header="2" Width="50" DisplayMemberBinding="{Binding Path=Field2}" /> 
        <GridViewColumn Header="3" Width="100" DisplayMemberBinding="{Binding Path=Field3}" /> 
       </GridView.Columns> 
      </GridView> 
     </ListView.View> 
</ListView> 
</ListBox> 

我只是不能填充從我的列表中的項目C#代碼嗎?

回答

13

這是它組合在一起簡而言之方式。

首先,您定義一個模型來保存綁定的數據。

public sealed class MyListBoxItem 
{ 
    public string Field1 {get;set;} 
    public string Field2 {get;set;} 
    public string Field3 {get;set;} 
} 

現在,你必須有一個持有這些模型進行綁定的類。這種類型通常稱爲ViewModel;它根據來自View的用戶輸入向View提供信息以進行綁定。它的公共屬性通常ObservableCollections和DependencyProperties這樣在視圖模型的變化將通過視圖(UI)被自動拾取:

public sealed class MyViewModel 
{ 
    public ObservableCollection<MylistBoxItem> Items {get;private set;} 
    public MyViewModel() 
    { 
    Items = new ObservableCollection<MyListBoxItem>(); 
    Items.Add(new MyListBoxItem{Field1="One", Field2="Two",Filed3="Three"}; 
    } 
} 

在代碼隱藏你的UI,「查看」,您實例化你的ViewModel並將其設置爲View的DataContext。

public MyView() 
{ 
    this.DataContext = new MyViewModel(); 
} 

這是非常重要的,因爲DataContext通過可視化樹「流動」。它可用於設置它的每個子元素。

要顯示的項目,我必須綁定ListView中到DataContext的物品屬性的的ItemsSource(這被理解)。 ListView中的每一行都將其DataContext設置爲Items屬性中的每個單獨的MyViewModel。所以你必須將每個顯示成員綁定到MyListBoxItem的屬性。

<ListView Name="RecordListView" ItemsSource="{Binding Items}"> 
    <ListView.View> 
     <GridView> 
      <GridView.Columns> 
       <GridViewColumn Header="1" Width="Auto" DisplayMemberBinding="{Binding Path=Field1}" /> 
       <GridViewColumn Header="2" Width="50" DisplayMemberBinding="{Binding Path=Field2}" /> 
       <GridViewColumn Header="3" Width="100" DisplayMemberBinding="{Binding Path=Field3}" /> 
      </GridView.Columns> 
     </GridView> 
    </ListView.View> 
</ListView> 

要了解這整個過程中更好,尋找高評級的問題在這裏標記[MVVM]

此外,爲幫助調試您的綁定,對於詳細的數據綁定配置調試: Verbose databinding

+0

+1非常具有描述性......當然有幫助。但我仍然建議打下基礎,熟悉數據綁定和數據模型,然後去MVVM – biju 2011-03-07 14:15:36

+0

感謝這樣一個全面的答案,我創建了ViewModel並得到了這個工作。有沒有辦法刷新事件的ViewModel/Items列表,因爲此代碼連接到數據庫,所以實時更新,我需要在屏幕上反映這些更改 – MattP 2011-03-07 14:49:39

+0

@Matt聽起來像你想創建一個[ DispatcherTimer](http://msdn.microsoft.com/zh-cn/library/system.windows.threading.dispatchertimer.aspx)。您可以響應其Tick事件並更新ViewModel的公共屬性作爲響應。您的屬性必須通過成爲DependencyProperties,ObservableCollections或實現INotifyPropertyChanged的VM來傳播更新通知。您還必須瞭解從後臺線程更新UI的問題(Tick事件不會在UI線程上觸發)。所有這些主題都可以在這裏搜索。 – Will 2011-03-07 15:28:33

4

您不必同時使用listbox和listview。您可以使用帶有數據模板的列表框或使用列表視圖與gridviewcolumns。

檢查下面的鏈接瞭解如何填充一個列表框正確

http://www.c-sharpcorner.com/uploadfile/mahesh/wpflistbox08252008100659am/wpflistbox.aspx

http://www.wpftutorial.net/ListBoxDataTemplate.html

http://www.codeproject.com/KB/WPF/CustomListBoxLayoutInWPF.aspx

我強烈建議你去通過下面的鏈接,掌握強大的數據綁定和wpf中數據壓縮的基礎

http://msdn.microsoft.com/en-us/library/ms742521.aspx

http://www.codeproject.com/KB/WPF/GuidedTourWPF_4.aspx

http://www.wpftutorial.net/DataTemplates.html

+2

並且還保持這種XAML結合的cheatsheet供參考:http://www.nbdtech.com/Free/WpfBinding.pdf – ShahidAzim 2011-03-07 14:06:37

+0

謝謝,那裏有一些很好的閱讀。感謝Shahid也提供了Cheatsheet。 – MattP 2011-03-07 14:36:22