在另一个线程WinRT中从ViewModel更新INotifyPropertyChanged-property

时间:2012-06-27 15:22:51

标签: multithreading mvvm windows-8

我有一个RaisePropertyChanged(PropName, oldValue, true, true)的属性,当我没有任何连接到互联网时,它会抛出异常,我在错误的线程上。 所以我想从我的ViewModel更新属性,但是如何在ViewModel中获取当前线程或者您对解决方案的建议是什么?

我的ViewModel-ctor

public MyViewModel()
{
   // START LISTENING TO NETWORKSTATUS
   NetworkInformation.NetworkStatusChanged += OnNetworkStatusChangedHandler;
}

NetworkChanged-callback方法

   private async void OnNetworkStatusChangedHandler(object sender)
   {
       ConnectionProfile profile = NetworkInformation.GetInternetConnectionProfile();

       if (profile == null)
       {
          IsRefreshEnabled = false;
       }
       else
       {
          IsRefreshEnabled = true;
       }

   }

我的财产

public const string IsRefreshEnabledPropertyName = "IsRefreshEnabled";
        private bool _isRefreshEnabled = true;
        public bool IsRefreshEnabled
        {
            get { return _isRefreshEnabled; }

            set
            {
                if (_isRefreshEnabled == value) { return; }

                var oldValue = _isRefreshEnabled;
                _isRefreshEnabled = value;
                RaisePropertyChanged(IsRefreshEnabledPropertyName, oldValue, value, true);
            }
        }

提前致谢!

1 个答案:

答案 0 :(得分:5)

您需要将RaisePropertyChanged调用替换为:

await Dispatcher.RunAsync(DispatcherPriority.Normal, (){RaisePropertyChanged(IsRefreshEnabledPropertyName, oldValue, value, true)});  

这将导致调用RaisePropertyChanged在UI线程上运行。

我假设你的类派生自Xaml控件(访问控件上的Dispatcher属性)。