2012-07-30 75 views
0

我還是很新,嘗試我的第一個嚴重的數據綁定。我已經閱讀了很多關於它是如何工作的,我只是爲這個具體的例子而努力。我試圖閱讀所有可以找到的鏈接,但大多數消息來源往往在關鍵位置有點不準確。所以這裏是:綁定或響應。 DataTemplate混淆

- 我的應用程序動態生成一個類型爲'List'的變量'PlayerList',其中'Player'是一個複雜的對象。

- 我想通過綁定顯示在列表框中。 Obvoiusly,因爲Player是一個複雜的對象,我想爲它創建一個DataTemplate。所以我在「Window1.xaml」是這樣的:在「App.xaml中」

<ListBox 
    Name="ListBox_Players" 
    ItemsSource="{Binding Source={StaticResource PlayerListResource}}" 
    ItemTemplate="{StaticResource PlayerTemplate}"> 
</ListBox> 

和這樣的事情:

<DataTemplate x:Key="PlayerTemplate"> <!-- DataType="{x:Type Player}" --> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding Path=name}"/> 
     <TextBlock Text=", "/> 
     <TextBlock Text="{Binding Path=nrOfTabls}"/> 
    </StackPanel> 
</DataTemplate> 

當然,這個模板將變得更加冗長後。正如你在上面看到的,我試圖爲PlayerList變量創建一個資源,但尚未管理,即smthn。像這樣

<src: XXX x:Key="PlayerListResource"/> 

其中對於XXX,據我瞭解,我應該輸入Resource變量的類。我試過

List<Player>, List<src:Player> 

等,但obv。 XAML在'<,>'字符中遇到問題。我也有另外一個問題:通過不直接綁定(即在C#中編寫「ListBox_Players.ItemsSource = PlayerList;」)並刪除'ItemTemplate'聲明並覆蓋該方法的ToString()方法播放器類輸出播放器的名稱我已經看到綁定的作品(即,我得到列表框中的播放器名稱列表)。但是,如果我再次插入模板,它只會顯示','我的模板不起作用!

+0

你能後的代碼對應於上述XAML的播放器和C#代碼? (例如,如果上面的XAML在MailWindow.xaml中,那麼發佈MainWindow.xaml.cs) – ikh 2012-07-30 14:09:38

+0

嗨ikh,我的.cs很長,但關於這個問題的部分沒有特別之處。正如我在下面寫的,它似乎是通過用屬性替換類中的字段來解決的。我雖然沒有找到一個單一的來源告訴我,我可以綁定的對象實例的內部事物是prorepties,而不僅僅是字段。這確實是另一個非常有說服力的理由,總是使用屬性! – EluciusFTW 2012-07-30 19:12:58

+0

但是,如果我想添加對類列表的'PlayerList'的引用,那另一個問題呢?我如何在XAML中執行此操作? – EluciusFTW 2012-07-30 19:14:04

回答

1

你得到沒有別的只是逗號的事實表明,我認爲的Player成員或者名稱不中DataTemplate匹配Path=名稱(我曾在一個點這個問題),或有關Player成員無法訪問。

我剛剛測試了你到目前爲止顯示的代碼,看起來工作正常。我所做的唯一的變化是改變這一行:

ItemsSource="{Binding Source={StaticResource PlayerListResource}}" 

這一行:

ItemsSource = "{Binding}" 

這告訴它會得到在運行時的ItemsSource程序。

Player類是:

class Player { 
    public string name { get; set; } 
    public int nrOfTabls { get; set; } 
} 

和我MainWindow.xaml.cs是:

public partial class MainWindow : Window { 
    private ObservableCollection<Player> players_; 

    public MainWindow() { 
     InitializeComponent(); 

     players_ =new ObservableCollection<Player>() { 
      new Player() { 
       name = "Alex", 
       nrOfTabls = 1, 
      }, 
      new Player() { 
       name = "Brett", 
       nrOfTabls = 2, 
      }, 
      new Player() { 
       name="Cindy", 
       nrOfTabls = 231, 
      } 
     }; 

     ListBox_Players.ItemsSource = players_; 
    } 
} 
+0

嗨ikh,感謝您的努力!如果你看看你的代碼,你完成了我在我的問題的最後幾行推測的內容:你的'name'和'nrOfTabls'是PROPERTIES而不是FIELDS。我幾分鐘前試過了,瞧,綁定工作。所以看來你只能綁定一個對象實例的屬性,而不是字段。這通常是真的嗎? – EluciusFTW 2012-07-30 19:08:27

+0

@ToaoG哇,我不知道這不適用於屬性!反射對待屬性不同於字段,所以這可能是爲什麼。 – ikh 2012-07-30 19:56:39

+0

只是爲了澄清,因爲你寫的是相反的,它確實對物業起作用,但對田地沒有作用。 – EluciusFTW 2012-07-30 21:48:50