代码之家  ›  专栏  ›  技术社区  ›  Anthony Waqas Raja

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

  •  3
  • Anthony Waqas Raja  · 技术社区  · 16 年前

    我有一个消息类:

    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;                
            }
        }
    }
    

    }

        <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;
    

    我错过了什么?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Bryant    16 年前

    您的消息属性可能是由数据绑定设置的,它绕过了您的实际消息属性(而不是依赖项属性)。若要修复此问题,请在该属性上添加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