locked
Непонятное исключение System.UnauthorizedAccessException в программе RRS feed

  • Вопрос

  • Помогите плиз!

    При попытке записи значения в свойство класса возникает исключение System.UnauthorizedAccessException в куске кода 

    public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (null != handler)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName)); // Здесь ошибка!!!!!!!!!!!! System.UnauthorizedAccessException
                }
            }

    полный код класса:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Devices.Sensors;
    
    namespace PivotApp2.ViewModels
    {
        public class Compas : INotifyPropertyChanged
        {
            Microsoft.Devices.Sensors.Compass _Compass;
            CompassReading CompassData;
            public Compas() 
            {
            if (Microsoft.Devices.Sensors.Compass.IsSupported) 
            {    
                _Compass = new Microsoft.Devices.Sensors.Compass();
                _Compass.Calibrate += MyCompassCalibrate;     
                _Compass.CurrentValueChanged += MyCompassCurrentValueChanged;
                _Compass.Start();
            }
            }
    
    
            double _Direction=0;
            public double Direction
                {
                    get { return _Direction; }
                set
                {
                    if (value != _Direction)
                        _Direction = value;
                    NotifyPropertyChanged("Direction");
                }
            }
    
            void MyCompassCalibrate(object sender, CalibrationEventArgs e) 
            {    
                // код, реализующий калибровку 
            }  
            void MyCompassCurrentValueChanged(object sender, SensorReadingEventArgs<Microsoft.Devices.Sensors.CompassReading> e) 
     
            {
             //   CompassData = e.SensorReading;
              //  Direction = CompassData.MagneticHeading;
                Direction = e.SensorReading.MagneticHeading;
                // код, обрабатывающий данные компаса }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (null != handler)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName)); // Здесь ошибка!!!!!!!!!!!! System.UnauthorizedAccessException
                }
            }
        }
    }
    


    23 августа 2014 г. 14:06

Ответы

  • Ага, ясно. Синхронизируйте это:

      NotifyPropertyChanged("Direction");

    с UI потоком.

    К примеру, вот так:

    Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
    		NotifyPropertyChanged("Direction");
    	    });

    • Помечено в качестве ответа shulp 28 августа 2014 г. 11:37
    28 августа 2014 г. 9:01

Все ответы

  • Куда Вы биндите Direction?
    24 августа 2014 г. 7:19
  • Вот код с MainPage.xaml

    <phone:PhoneApplicationPage 
        x:Class="PivotApp2.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:viewmodel="clr-namespace:PivotApp2.ViewModels"
        xmlns:main="clr-namespace:PivotApp2"
        mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 
        d:DataContext="{d:DesignData SampleData/MainViewModelSampleData.xaml}"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait"  Orientation="Portrait"
        shell:SystemTray.IsVisible="True">
    
        <!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <!--<Grid.Resources>
                <viewmodel:Compas x:Key="CompasViewModel"/>
            </Grid.Resources>-->
            <!--Элемент управления Pivot-->
            <controls:Pivot Title="гид путешественника">
                <!--Первый элемент Pivot-->
                <controls:PivotItem Name="pviCompas" Header="компас" >
                    <!--<controls:PivotItem.DataContext>
                        <Binding Source="CompasView" />
                    </controls:PivotItem.DataContext>-->
                    <StackPanel>
                        <Image Margin="35,10,54,204" Source="kompass_arrow.png" Stretch="Fill" RenderTransformOrigin="0.5,0.5" Height="361">
                            <!--<Image.RenderTransform>
                                <RotateTransform Angle="{Binding Direction}"/>
                            </Image.RenderTransform>-->
                        </Image>
                        <TextBlock Text="{Binding Direction}" />
                    </StackPanel>
                </controls:PivotItem>
    

    И с App.xaml.cs

      public static Compas CompasView
            {
                get
                {
                    if (compasView == null) compasView = new Compas();
                    return compasView;
                }
            }

    25 августа 2014 г. 9:55
  • Ага, ясно. Синхронизируйте это:

      NotifyPropertyChanged("Direction");

    с UI потоком.

    К примеру, вот так:

    Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
    		NotifyPropertyChanged("Direction");
    	    });

    • Помечено в качестве ответа shulp 28 августа 2014 г. 11:37
    28 августа 2014 г. 9:01
  • Спасибо! Все отлично работает! 
    28 августа 2014 г. 11:38