Windows应用商店应用(8.1):INotifyPropertyChanged必须是顶级?

时间:2014-11-20 06:43:04

标签: c# data-binding windows-runtime

为什么这样:

public class ViewModel : INotifyPropertyChanged
{
    private string _bp;

    public event PropertyChangedEventHandler PropertyChanged; 

    public string BindableProperty
    {
        get { return _bp; }

        set
        {
            _bp = value;
            NotifyPropertyChanged();
        }
    }

    protected void NotifyPropertyChanged( [CallerMemberName] string caller = "" )
    {
        var eventHandler = PropertyChanged;

        if( eventHandler != null )
            eventHandler( this, new PropertyChangedEventArgs( caller ) );
    }
}

在Windows应用商店应用页面中正确绑定(即,绑定目标正在侦听PropertyChanged事件,可以通过中断NotifyPropertyChanged并查看eventHandler不为null来验证)。但是这个:

public interface IViewModel : INotifyPropertyChanged
{
    string BindableProperty { get; set; }
}

public class ViewModel : IViewModel
{
    private string _bp;

    public event PropertyChangedEventHandler PropertyChanged; 

    public string BindableProperty
    {
        get { return _bp; }

        set
        {
            _bp = value;
            NotifyPropertyChanged();
        }
    }

    protected void NotifyPropertyChanged( [CallerMemberName] string caller = "" )
    {
        var eventHandler = PropertyChanged;

        if( eventHandler != null )
            eventHandler( this, new PropertyChangedEventArgs( caller ) );
    }
}

无法绑定(即,eventHandler始终为null,绑定目标永远不会反映对BindableProperty的更新)。

我在某处读到,由于WinRT不是托管代码,因此它不支持反射。因此,当托管应用程序启动时,操作系统的某些组件会构建一个隐藏对象,存储将通过反射获得的类型信息。我注意到的行为看起来像使用任何类型的扫描过程都不够智能,无法追溯到一系列派生的接口定义。

我的理论是正确的吗?或者我错过了导致问题的其他因素?

修改

谢谢Rob,回复。为了提供更多的上下文,我在一个异步方法中更新属性,这个异步方法在几个异步事件处理程序中调用(例如,private async void navigationHelper_LoadState(object sender,LoadStateEventArgs e),private async void btnSeek_Click(object sender,RoutedEventArgs e) )。

更重要的是,当我回去并重新运行我认为今天早上相同的代码时,一切都按预期工作,即使是" dervied"界面定义。显然,我改变了一些我不记得的方式。

鉴于我最近的经历,我现在怀疑我在编写和调用各种异步方法时遇到了问题。这对我来说是一个新的领域,我已经注意到各种各样的运行时间困难,例如,如果忘记等待"等待"异步操作。该应用程序仍将编译,但运行时行为非常不同。

0 个答案:

没有答案