为什么这样:
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"界面定义。显然,我改变了一些我不记得的方式。
鉴于我最近的经历,我现在怀疑我在编写和调用各种异步方法时遇到了问题。这对我来说是一个新的领域,我已经注意到各种各样的运行时间困难,例如,如果忘记等待"等待"异步操作。该应用程序仍将编译,但运行时行为非常不同。