Silverlight {Binding}不会访问类成员

时间:2011-07-17 14:22:51

标签: c# silverlight windows-phone-7 binding

我有一个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}"/>

1 个答案:

答案 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可能会有一些额外的怪癖。)