INotifyPropertyChanged不起作用

时间:2014-05-08 10:33:41

标签: c# windows-phone-8 data-binding windows-phone-8.1

我有一个简单的对象(在App.xaml.cs中全局启动):

public class now_playing : INotifyPropertyChanged
{
    // notify
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string p)
    {
        Debug.WriteLine(p + ": notify propertychanged");
        PropertyChangedEventHandler handler = PropertyChanged;
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(p));
    }

    // artist
    public string artist
    {
        get
        {
            return _artist;
        }
        set
        {
            _artist = value;
            NotifyPropertyChanged("artist");
        }
    }
    private string _artist;

    // album
    public string album
    {
        get
        {
            return _album;
        }
        set
        {
            _album = value;
            NotifyPropertyChanged("album");
        }
    }
    private string _album;

    // track title
    public string tracktitle
    {
        get
        {
            return _tracktitle;
        }
        set
        {
            _tracktitle = value;
            NotifyPropertyChanged("tracktitle");
        }
    }
    private string _tracktitle;
}

每当我更改值时,类都会通知(我看到调试)。 所以我猜问题就在于我的XAML或背后的代码。

网页代码:

public sealed partial class nowplaying : Page
{
    // artistdata
    public string artist { get { return App.nowplaying.artist; } }
    // albumdata
    public string album { get { return App.nowplaying.album; } }
    // trackdata
    public string tracktitle { get { return App.nowplaying.tracktitle; } }

    public nowplaying()
    {
        this.InitializeComponent();
        this.DataContext = this;
    }
}

XAML:

<Grid Margin="50">
    <TextBlock Text="{Binding tracktitle}" Foreground="White" FontSize="40"/>
    <TextBlock Foreground="#dcdcdc" FontSize="20" Margin="0,50,0,0">
        <Run Text="{Binding artist}"/>
        <Run Text=" - "/>
        <Run Text="{Binding album}"/>
    </TextBlock>
</Grid>

为什么更改值时UI不会更新?

堆栈追踪:

Music.exe!Music.App.InitializeComponent.AnonymousMethod__6(object sender = {Music.App}, Windows.UI.Xaml.UnhandledExceptionEventArgs e = {Windows.UI.Xaml.UnhandledExceptionEventArgs}) Line 50  C#

Music.exe!play_music.MessageReceivedFromBackground(object sender = null, Windows.Media.Playback.MediaPlayerDataReceivedEventArgs e = {Windows.Media.Playback.MediaPlayerDataReceivedEventArgs}) Line 57 C#

更新:问题解决了!调用propertychanged事件时我不得不使用调度程序:

CoreDispatcher dispatcher = CoreWindow.GetForCurrentThread().Dispatcher;
if (PropertyChanged != null)
{
    await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        this.PropertyChanged(this, new PropertyChangedEventArgs(p));
    });
}

2 个答案:

答案 0 :(得分:2)

你&#34;松散&#34; Page中属性中的更改通知,因为这些属性没有任何更改通知。

直接尝试使用now_playing

public sealed partial class nowplaying : Page
{
    public now_playing NowPlaying { get { return App.nowplaying; } }

    public nowplaying()
    {
        this.InitializeComponent();
        this.DataContext = this;
    }
}

<Run Text="{Binding NowPlaying.artist}"/>

否则,您需要在INotifiyPropertyChanged中实施nowplaying并转发来自now_playing的事件。

答案 1 :(得分:1)

您实际上绑定了实现INotifyPropertyChanged的nowplaying类的艺术家,专辑和跟踪标题