Silverlight 2.0 - 将域对象数据绑定到UserControl

时间:2008-11-30 14:37:48

标签: silverlight data-binding xaml

我开始使用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中的断点永远不会被命中,并且消息永远不会正确显示。

我错过了什么?

1 个答案:

答案 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;
}
  1. PropertyMetadata
  2. PropertyChangedCallback