我有一些来自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属性以获取主线程上的实际值?