TextBlock数据绑定到Singleton不在WPF中更新

时间:2009-02-24 16:42:20

标签: c# wpf

我为新手问题道歉,但我正在努力解决这个问题。我定义了以下TextBlock:

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

DeviceManager是一个单例,用作其他类的外观。例如,PlayerIPlayer类型的属性,表示音乐播放应用程序。我希望TextBlock能够显示当前正在播放的艺术家,该艺术家会在Player.CurrentArtist属性中定期更新。

不幸的是,当CurrentArtist属性更新时,我无法更新TextBlock。 DeviceManagerIPlayer都实现INotifyPropertyChanged,但当我单步执行应用程序时,DeviceManager没有附加事件处理程序。

有人建议如何在保留singleton-facade的同时更新文本块吗?

以下是DeviceManager和IPlayer子类中INotifyPropertyChanged成员的代码:

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 个答案:

答案 0 :(得分:2)

问题是WPF永远不会被通知CurrentArtist属性更改的值。您可以为CurrentArtist属性实现私有设置器,这将触发PropertyChanged事件,或触发PropertyChanged CurrentArtist属性的MediaPlayer.Play()事件

答案 1 :(得分:0)

当您更改Player属性时,UI如何知道?从那个代码来看,它看起来不像是向我提出了PropertyChanged。你能发一个问题的完整工作样本吗?否则我们不得不猜测。

答案 2 :(得分:0)

如果您传入的名称(即现在“播放器:歌曲”)与您绑定的属性相同,WPF仅响应PropertyChanged - 将PropertyChanged更改为“CurrentArtist”,您将看到它更新正常。

答案 3 :(得分:0)

您没有提出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
}
相关问题