Я прошу прощения за вопрос новичка, но я борюсь с этой проблемой. У меня есть следующее определение 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; }
}
}