自定义控件中的OnPropertyChanged事件访问ViewModel属性时出现问题

时间:2019-06-23 02:30:33

标签: c# xamarin events xamarin.forms custom-controls

我有一些来自github的自定义控件,每当对此控件进行更改时,我都需要在viewmodel上发送带有某些条件的套接字tcp消息。我在视图后面的代码中有OnPropertyChanged,该视图在viewModel中调用sendMessage函数。

消息已正确发送,但条件(视图模型的属性)未从实际值中获取。例如:我有一个IsEnabled bool属性,该属性设置为true,但是在通过OnPropertyChanged线程访问时,在sendMessage函数中读取为false。

我只能想象从另一个无法访问主线程值的线程触发了OnPropertyChanged事件,因此我尝试了以下操作:

  Device.BeginInvokeOnMainThread(() => 
  MainViewModel.getInstance().Joystick.sendMsg(JoystickControl.Distance, 
  JoystickControl.Angle));

这将是自定义控件的代码,可以在xaml中正常运行

       <CustomControls:JoystickControl x:Name="JoystickControl" 
        Grid.Row="4" BackgroundColor="#ececec"
                                    HorizontalOptions="Center" 
        VerticalOptions="Center" 
                                    Margin="0,10" BindingContext="{Binding 
            Joystick}" PropertyChanged="JoystickControl_PropertyChanged" 
                      IsEnabled="{Binding IsJoystickEnabled}">
         </CustomControls:JoystickControl>

这是我后面的完整代码:

      private void JoystickControl_PropertyChanged(object sender, 
       System.ComponentModel.PropertyChangedEventArgs e)
         {
        if (Application.Current.MainPage != null)
        {
            Device.BeginInvokeOnMainThread(() => 

    MainViewModel.getInstance().Joystick.sendMsg(JoystickControl.Distance, 
    JoystickControl.Angle));
              }
           }

这是我需要评估的财产:

    public bool IsTeachFlag { get; set; }

我也尝试过这个:

    private bool isTeaching;
    public bool IsTeaching
    {
        get { return this.isTeaching; }
        set { SetValue(ref this.isTeaching, value); }
    }

上面的方法调用SetValue方法以在属性更改时调用

我有sendMessage函数:

   public  async void sendMsg(double distance, double angle)
          {
            Response = new Response();
        if (IsTeachFlag) { 
     MainViewModel.getInstance().SelectedDevice.Message = "TEACHING,Distance=" + distance.ToString() + "&Angle=" + angle.ToString(); }
        else { MainViewModel.getInstance().SelectedDevice.Message = "DATA,Distance=" + distance.ToString() + "&Angle=" + angle.ToString(); }

            Response.Message = tcpService.sendMessage(MainViewModel.getInstance().SelectedDevice);

            if (Response.Message.Contains("FormatException"))
            {
                Response.IsSuccess = false;
                 await Application.Current.MainPage.DisplayAlert(Languages.Error, Languages.FormatValidation, Languages.Accept);
                return;

            }
            else if (Response.Message.Contains("ArgumentNullException") ||
               this.Response.Message.Contains("SocketException") || this.Response.Message.Contains("Exception"))
            {
                Response.IsSuccess = false;
                 await Application.Current.MainPage.DisplayAlert(Languages.Error, this.Response.Message, Languages.Accept);
                return;

            }

            else if (Response.Message.Contains("OK"))
            {
                Response.IsSuccess = true;

            }

            if (Response.IsSuccess)
            {

            }
            else
            {
                await Application.Current.MainPage.DisplayAlert(Languages.Error, Languages.tcpMessageError, Languages.Accept);
            }


    }

我也尝试了不使用异步并且结果是相同的:当它为true时,我永远不会得到IsTeachFlag值。我也尝试过使用其他属性。

我基本上需要在操纵杆移动时触发一个事件。我已经尝试过GestureRecognizers(滑动)和其他一些东西,这就是它发挥最佳作用的原因。

我该怎么做才能访问viewmodel属性以获取主线程上的实际值?

0 个答案:

没有答案