2011-07-17 3 views
1

ListBoxItemのために私はDataTemplateを持っていますが、これはかなり単純で、私のクラスのプロパティは{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は、両方のTextBlock sが完全に空になっているいくつかの理由..

<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> 

です。しかし、たとえば{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); 
    } 
} 

これは、バインドが非依存性プロパティーのリフレクションを使用しているためで、フィールドを検索しないためです。

(このアドバイスは、WPFのための問題を解決するだろうが、Silverlightは、いくつかの追加の癖を持っていることがあります。)

+0

あなたは正確に正しい、私はちょうどあなたがフィールドにデータバインディングを実行できないことを読みました。私が愚かな気分にさせてくれてありがとうございました;-)(私ができる時は5分で受け入れます) –

+0

@rudi:あなたは大歓迎です! – Vlad

関連する問題