2011-03-21 72 views
5

好的,我不是編程或C#的新手,因爲我似乎無法讓WPF的數據綁定直線前進。我的同事對此表示讚賞(是的,我也會問他們),但現在我很難過。似乎無法在我的腦海中獲得WPF DataBinding

這是我想對於初學者做什麼:

例如,我已經得到的東西像這樣的列表:

List<Thing> thingList = Source.getList(); 

現在通常我會去

foreach(Thing t in thingList) 
{ 
    //add thing to combobox 
} 

但從我能收集的是,我可以某種程度上不這樣做,但使用數據綁定來填充c ombobox對我來說。

我似乎無法得到的是其中我會把'thingList'?我是否在某處將它作爲單獨的財產?我在哪裏放置該物業?

我現在覺得很愚蠢,因爲我一直在爲此苦苦掙扎了一段時間,我找不到任何可以讓我明白這一點的例子 - 可能很簡單 - 概念。

任何人都願意幫助我或指點我一些分步指南我可能錯過了?

+0

如果它像的WinForms數據綁定任何東西,你的組合框應該有一個'DataSource'屬性(或類似的東西),你應該能夠設置'comboBox.DataSource = Source.getList();'作爲只要設置了「DisplayMember」和「ValueMembers」,就會顯示正確的內容,而SelectedValue將檢索對象本身。 – Crisfole 2011-03-21 19:52:09

+0

這裏有幾個SO問題會讓你開始正確的方向:[綁定WPF組合框到自定義列表](http://stackoverflow.com/questions/561166/binding-wpf-combobox-toa-a-自定義列表)和[MVVM:教程從開始到結束](http://stackoverflow.com/questions/1405739/mvvm-tutorial-from-start-to-finish) – 2011-03-21 19:53:16

+0

在WPF中,使用ComboBoxes和ListViews之類的東西作爲數據的可視容器。在代碼後面或文件等中構建和編輯您的列表,並綁定到表單上的控件。 – coldandtired 2011-03-21 20:38:14

回答

2

在WPF中使用ObservableCollection<T>進行數據綁定。 T是你的班級。看下面的例子

public class NameList : ObservableCollection<PersonName> 
{ 
    public NameList() : base() 
    { 
     Add(new PersonName("A", "E")); 
     Add(new PersonName("B", "F")); 
     Add(new PersonName("C", "G")); 
     Add(new PersonName("D", "H")); 
    } 
    } 

    public class PersonName 
    { 
     private string firstName; 
     private string lastName; 

     public PersonName(string first, string last) 
     { 
      this.firstName = first; 
      this.lastName = last; 
     } 

     public string FirstName 
     { 
      get { return firstName; } 
      set { firstName = value; } 
     } 

     public string LastName 
     { 
      get { return lastName; } 
      set { lastName = value; } 
     } 
    } 

現在在XAML中。轉到資源標籤

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

    xmlns:c="clr-namespace:SDKSample" 

    x:Class="Sample.Window1" 
    Width="400" 
    Height="280" 
    Title="MultiBinding Sample"> 

    <Window.Resources> 
    <c:NameList x:Key="NameListData"/> 
    </Window.Resources> 


<ListBox Width="200" 
     ItemsSource="{Binding Source={StaticResource NameListData}}" // Name list data is declared in resource 
     ItemTemplate="{StaticResource NameItemTemplate}" 
     IsSynchronizedWithCurrentItem="True"/> 

xmnls:c會給你選擇類的選項。在這裏,你可以選擇c,d,e x,但是要確保它應該早些使用

+1

當收集預計會發生變化時,您只需要使用'ObservableCollection'。如果集合是靜態的,那麼實現'IEnumerable'的任何東西都可以。 – 2011-03-21 19:57:05

+0

是的,我知道,它會用於你需要雙向綁定時,否則只是數據源和數據值成員等工作 – 2011-03-21 19:59:26

+0

這主要是我在找什麼,是的。我知道這是一個非常廣泛的主題,但是你所描述的主要是我正在考慮的'自動'過程。謝謝。 – 2011-03-23 11:56:13

2

當涉及到數據綁定時,我發現this page如果仔細閱讀,大多數初學者都會回答這個問題。

要回答這個問題:添加所有項目的原因是告訴組合框從哪裏獲取其項目,這是通過ItemsSource屬性完成的。

您可以設置這在XAML或代碼,而你需要在XAML綁定表達式正常的分配應該做的代碼:

comboBox.ItemsSource = thingList; 

如果不指定在進一步如何將這些對象列表將被顯示ToString方法將被調用,除非被覆蓋,否則通常會以對象的類路徑結束。有兩種主要的方式來告訴應用程序如何顯示對象:

拳頭和更重的選項是Data Templates它用於顯示覆雜的數據使用控件(反過來可以有項目和模板等),第二個方式是使用像DisplayMemberPath這樣的輕量級屬性,它應該被設置爲應該顯示的屬性的名稱(通常只是一個字符串)。

如果您的列表的變化和組合框應自行更新源應實現INotifyCollectionChanged,在大多數情況下,你會使用標準的實施ObersableCollection<T>

1

大多數人會使用WPF Databinding來填充組合框,但是你不需要。

如果您願意,可以通過代碼添加項目。

很容易被困在做任何事情,因爲它「應該」沒有一個很好的理由這樣做(順便說一句,我不建議你手動添加項目,我只是說你可以)。

List<Thing> thingList = Source.getList(); 

foreach(Thing t in thingList) 
{ 
    combobox.Items.Add(t); 
} 
+0

這可能是實現這個目標的最糟糕的方式,並且有很多好的理由不這樣做。至少你應該更新你的例子來將集合分配給ItemsSource,而不是單獨添加每個項目。 – 2011-03-21 23:26:35

+0

我以爲我明確表示我並不推薦這種填充列表的方式。我只是迴應聲明「但從我能收集的是,我可以以某種方式不這樣做」。 – grantnz 2011-03-22 00:33:06

相關問題