2011-07-17 31 views
1

我有一個DataTemplate ListBoxItem(應該)相當簡單,只需通過{Binding}訪問我的類的屬性。Silverlight {Binding}將不會訪問類成員

下面是我的類和代碼,它創建ListBox的簡單(虛擬)ItemsSource。

public class ChatMessage 
{ 
    public string Message = "Testing Message"; 
    public DateTime DateReceived = new DateTime(2011, 07, 16, 14, 00, 05); 

    public override string ToString() 
    { 
     return Message; 
    } 
} 

// .... 

// Dummy Data 
ObservableCollection<ChatMessage> chatItems = new ObservableCollection<ChatMessage>(); 
for (int i = 0; i < 20; i++) 
    chatItems.Add(new ChatMessage()); 
lbMessages.ItemsSource = chatItems; 

這裏是我的DataTemplate ..

<DataTemplate x:Key="ChatItemListBox"> 
    <Grid Width="362"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="26" /> 
     </Grid.RowDefinitions> 
     <TextBlock Text="{Binding Message}" /> 
     <TextBlock Grid.Row="1"Text="{Binding DateReceived}"/> 
    </Grid> 
</DataTemplate> 

出於某種原因,這兩個TextBlock s爲完全是空的。但是,如果我將例如{Binding Message}更改爲{Binding},它將調用ToString並顯示消息。

我知道我必須失去了一些東西很簡單..

以防萬一它的事項,列表框的定義如下:

<ListBox x:Name="lbMessages" Margin="0,8,0,72" ItemTemplate="{StaticResource ChatItemListBox}"/> 

回答

4

你應該使用屬性,而不是字段。

public class ChatMessage 
{ 
    public string Message { get; set; } 
    public DateTime DateReceived { get; set; } 

    public override string ToString() 
    { 
     return Message; 
    } 

    public ChatMessage() 
    { 
     Message = "Testing Message"; 
     DateReceived = new DateTime(2011, 07, 16, 14, 00, 05); 
    } 
} 

這是因爲綁定對非-DependencyProperties使用反射,並且不尋找字段。

(這個建議就解決了WPF的問題,但Silverlight可能有一些額外的怪癖。)

+0

你說得對,我剛讀,你不能對字段執行數據綁定。謝謝你讓我感到愚蠢,並修復我的苦難;-)(在5分鐘內,我能接受!) –

+0

@rudi:不客氣! – Vlad