【问题标题】:Silverlight 2.0 - databinding a domain object to a UserControlSilverlight 2.0 - 将域对象数据绑定到 UserControl
【发布时间】:2008-11-30 14:37:47
【问题描述】:

我从 Silverlight 开始。我想在 UI 上显示消息列表,但数据绑定不适合我。

我有一个消息类:

public class Message 
{
    public string Text { get; set; } 
    ...
}

我有带有消息依赖属性的消息显示 Silverlight 用户控件:

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 属性设置器中的断点,并且消息从未正确显示。

我错过了什么?

【问题讨论】:

    标签: silverlight data-binding xaml


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 2019-05-08
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      相关资源
      最近更新 更多