Данные TextBlock, привязанные к Singleton, не обновляются в WPF - PullRequest
1 голос
/ 24 февраля 2009

Я прошу прощения за вопрос новичка, но я борюсь с этой проблемой. У меня есть следующее определение TextBlock:

<TextBlock Text="{Binding Source={x:Static local:DeviceManager.Instance},
 Path=Player.CurrentArtist}"></TextBlock>

DeviceManager - это синглтон, который функционирует как фасад для других классов. Например, Player - это свойство типа IPlayer, которое представляет приложение для воспроизведения музыки. Я хотел бы, чтобы TextBlock отображал исполнителя, который в данный момент воспроизводится, который периодически обновляется в свойстве Player.CurrentArtist.

К сожалению, я не могу обновить TextBlock при обновлении свойства CurrentArtist. И DeviceManager, и IPlayer реализуют INotifyPropertyChanged, но когда я выполняю приложение, к DeviceManager не подключается обработчик событий.

У кого-нибудь есть предложения по обновлению текстового блока при сохранении одноэлементного фасада?

Вот код для членов INotifyPropertyChanged как в DeviceManager, так и в подклассе IPlayer:

public sealed class DeviceManager : INotifyPropertyChanged
{
    // Singleton members omitted

    public IPlayer Player
    {
        get { return player; }
        set
        {
            this.player = value;
            player.PropertyChanged += new PropertyChangedEventHandler(device_PropertyChanged);
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void device_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(sender, e);
        }
    }

    #endregion
}

class MediaPlayer : IPlayer
{
    private string artist;
    private string title;

    public event PropertyChangedEventHandler PropertyChanged;

    public void Play(string artist, string title)
    {
        this.artist = artist;
        this.title = title;
        OnPropertyChanged("Player:Song");
    }

    private void OnPropertyChanged(string p)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(p));
        }
    }

    public string CurrentTitle
    {
        get { return title; }
    }

    public string CurrentArtist
    {
        get { return artist; }
    }

}

Ответы [ 4 ]

2 голосов
/ 24 февраля 2009

Проблема в том, что WPF никогда не уведомляется об изменении значения свойства CurrentArtist. Вы можете реализовать частный установщик для свойства CurrentArtist, который будет вызывать событие PropertyChanged, или вызвать событие PropertyChanged для свойства CurrentArtist в MediaPlayer.Play().

0 голосов
/ 25 февраля 2009

Вы не вызываете событие PropertyChanged, вам нужно:

public sealed class DeviceManager : INotifyPropertyChanged
{
    // Singleton members omitted

    public IPlayer Player
    {
        get { return player; }
        set
        {
            this.player = value;
            OnPropertyChanged(this, new PropertyChangedEventArgs("Player"));
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(sender, e);
        }
    }

    #endregion
}
0 голосов
/ 24 февраля 2009

WPF отвечает на PropertyChanged только в том случае, если имя, которое вы передаете (т. Е. Прямо сейчас «Player: Song»), совпадает со свойством, к которому вы привязаны - измените PropertyChanged на «CurrentArtist», и вы увидите, что оно обновляется должным образом.

0 голосов
/ 24 февраля 2009

Как пользовательский интерфейс узнает, когда вы меняете свойство Player? Из этого кода это не похоже, что вызывает PropertyChanged для меня. Можете ли вы опубликовать полный рабочий образец проблемы? В противном случае мы вынуждены просто догадываться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...