我有一个DataTemplate
的ListBoxItem(应该)非常简单,只需通过{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
两个都是空的。但是,如果我将{Binding Message}
更改为{Binding}
,则会调用ToString并显示该消息。
我知道我必须遗漏一些非常简单的事情。
以防万一,ListBox的定义如下:
<ListBox x:Name="lbMessages" Margin="0,8,0,72" ItemTemplate="{StaticResource ChatItemListBox}"/>
答案 0 :(得分: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可能会有一些额外的怪癖。)