Silverlight 2.0 - привязка данных объекта домена к UserControl - PullRequest
3 голосов
/ 30 ноября 2008

Я начинаю с Silverlight. Я хочу отобразить список сообщений в пользовательском интерфейсе, но привязка данных не работает для меня.

У меня есть класс сообщения:

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

У меня отображается сообщение Silverlight User control со свойством зависимости 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 никогда не достигается, и сообщение никогда не отображается должным образом.

Что я пропустил?

1 Ответ

3 голосов
/ 30 ноября 2008

Ваше свойство 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...