我开始使用Silverlight。我想在UI上显示消息列表,但数据绑定对我不起作用。
我有一个Message类:
public class Message
{
public string Text { get; set; }
...
}
我的消息显示Silverlight用户控件,带有Message依赖属性:
public partial class MessageDisplay : UserControl
{
public static readonly DependencyProperty MessageProperty =
DependencyProperty.Register("Message", typeof(Message),
typeof(MessageDisplay), null);
public MessageDisplay()
{
InitializeComponent();
}
public Message Message
{
get
{
return (Message)this.GetValue(MessageProperty);
}
set
{
this.SetValue(MessageProperty, value);
this.DisplayMessage(value);
}
}
private void DisplayMessage(Message message)
{
if (message == null)
{
this.MessageDisplayText.Text = string.Empty;
}
else
{
this.MessageDisplayText.Text = message.Text;
}
}
}
}
然后在主控件xaml中我有
<ListBox x:Name="MessagesList" Style="{StaticResource MessagesListBoxStyle}">
<ListBox.ItemTemplate>
<DataTemplate>
<Silverbox:MessageDisplay Message="{Binding}"></Silverbox:MessageDisplay>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox
我绑定了control.xaml.cs代码:
this.MessagesList.SelectedIndex = -1;
this.MessagesList.ItemsSource = this.messages;
数据绑定没有错误,并且似乎列表中有正确数量的项目,但MessageDisplay的Message属性settor中的断点永远不会被命中,并且消息永远不会正确显示。
我错过了什么?
答案 0 :(得分:3)
你的Message属性可能是由数据绑定设置的,它绕过你的实际Message属性(而不是依赖属性)。要解决此问题,请在该属性上添加PropertyChangedCallback。
public static readonly DependencyProperty MessageProperty =
DependencyProperty.Register("Message", typeof(Message), typeof(MessageDisplay),
new PropertyMetadata(
new PropertyChangedCallback(MessageDisplay.MessagePropertyChanged));
public static void MessagePropertyChanged(DependencyObject obj, DependecyPropertyChangedEventArgs e)
{
((MessageDisplay)obj).Message = (Message)e.NewValue;
}