C# 绑定到单例的TextBlock数据未在WPF中更新

C# 绑定到单例的TextBlock数据未在WPF中更新,c#,wpf,C#,Wpf,我为这个新手问题道歉,但我正在努力解决这个问题。我定义了以下文本块: <TextBlock Text="{Binding Source={x:Static local:DeviceManager.Instance}, Path=Player.CurrentArtist}"></TextBlock> 用户界面如何知道何时更改播放器属性?从这段代码来看,它看起来并没有向我提出PropertyChanged。你能发布这个问题的完整工作示例吗?否则我们只能猜测。问题是,WPF

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

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

用户界面如何知道何时更改播放器属性?从这段代码来看,它看起来并没有向我提出PropertyChanged。你能发布这个问题的完整工作示例吗?否则我们只能猜测。

问题是,WPF从未被通知
CurrentArtister
属性的值发生更改。您可以为
CurrentArtister
属性实现一个私有setter,它将触发
PropertyChanged
事件,或者为
MediaPlayer.Play()中的
CurrentArtister
属性触发
PropertyChanged
事件。
WPF仅在传入名称时响应PropertyChanged(即,现在的“Player:Song”)与您绑定的属性相同-将PropertyChanged更改为“CurrentArtister”,您将看到它正确更新。

您没有引发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
}
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
}