C# 如何在mvvmcross中正确注册自定义绑定?
我试图在mvvmcross中使用UIActivityIndicatorView的自定义绑定,但无法使其正常工作。 我听从了建议。因此,我创建了自定义活页夹类:C# 如何在mvvmcross中正确注册自定义绑定?,c#,xamarin,mvvmcross,C#,Xamarin,Mvvmcross,我试图在mvvmcross中使用UIActivityIndicatorView的自定义绑定,但无法使其正常工作。 我听从了建议。因此,我创建了自定义活页夹类: public class ActivityIndicatorViewHiddenTargetBinding : MvxConvertingTargetBinding { public ActivityIndicatorViewHiddenTargetBinding(UIActivityIndicatorView target)
public class ActivityIndicatorViewHiddenTargetBinding : MvxConvertingTargetBinding
{
public ActivityIndicatorViewHiddenTargetBinding(UIActivityIndicatorView target)
: base(target)
{
if (target == null)
{
MvxBindingTrace.Trace(
MvxTraceLevel.Error,
"Error - UIActivityIndicatorView is null in ActivityIndicatorViewHiddenTargetBinding");
}
}
public override MvxBindingMode DefaultMode
{
get { return MvxBindingMode.OneWay; }
}
public override System.Type TargetType
{
get { return typeof(bool); }
}
protected UIActivityIndicatorView View
{
get { return Target as UIActivityIndicatorView; }
}
protected override void SetValueImpl(object target, object value)
{
var view = (UIActivityIndicatorView)target;
if (view == null)
{
return;
}
view.Hidden = (bool)value;
if (view.Hidden)
{
view.StopAnimating();
}
else
{
view.StartAnimating();
}
}
}
我试着注册
public class Setup : MvxIosSetup
{
// ...
protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
{
registry.RegisterPropertyInfoBindingFactory(
typeof(ActivityIndicatorViewHiddenTargetBinding),
typeof(UIActivityIndicatorView), "Hidden");
base.FillTargetFactories(registry);
}
// ...
}
设置绑定的代码:
public override void ViewDidLoad()
{
base.ViewDidLoad();
var bindingSet = this.CreateBindingSet<LoginView, LoginViewModel>();
bindingSet.Bind(Username).To(vm => vm.Username);
bindingSet.Bind(Password).To(vm => vm.Password);
bindingSet.Bind(LoginButton).To(vm => vm.LoginCommand);
//Progress is UIActivityIndicator
bindingSet.Bind(Progress)
.For(p => p.Hidden)
.To(vm => vm.IsLoading);
.WithConversion("Inverse");
bindingSet.Apply();
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
var bindingSet=this.CreateBindingSet();
bindingSet.Bind(用户名).To(vm=>vm.Username);
bindingSet.Bind(Password).To(vm=>vm.Password);
bindingSet.Bind(LoginButton.To)(vm=>vm.LoginCommand);
//进度是UIActivityIndicator
bindingSet.Bind(进度)
.For(p=>p.Hidden)
.To(vm=>vm.IsLoading);
.具有转换(“逆”);
bindingSet.Apply();
}
以及PCL库中正在调用服务器的代码:
public class LoginViewModel : MvxViewModel
{
// ...
private bool _isLoading;
public bool IsLoading
{
get { return _isLoading; }
set { SetProperty(ref _isLoading, value);}
}
private IMvxCommand _loginCommand;
public virtual IMvxCommand LoginCommand
{
get
{
_loginCommand = _loginCommand ?? new MvxAsyncCommand(AttemptLogin, CanExecuteLogin);
return _loginCommand;
}
}
private async Task AttemptLogin()
{
IsLoading = true;
try
{
await Task.Run(async () =>
{
await _loginService.LogIn(Username, Password);
});
ShowViewModel<MainViewModel>();
}
catch (SecurityClientException exc)
{
_dialogService.Alert(exc.Message, "Login Failed", "OK");
}
catch (Exception exc)
{
_dialogService.Alert($"Unknown error: {exc.Message}", "Login Failed", "OK");
}
finally
{
IsLoading = false;
}
}
// ...
}
公共类LoginViewModel:MvxViewModel
{
// ...
私家车装载;
公共布尔孤岛加载
{
获取{return\u isLoading;}
set{SetProperty(ref_isLoading,value);}
}
专用IMvxCommand _loginCommand;
公共虚拟imvx命令LoginCommand
{
得到
{
_loginCommand=\u loginCommand??新的MvxAsyncCommand(AttemptLogin,CanExecuteLogin);
返回_loginCommand;
}
}
专用异步任务AttemptLogin()
{
IsLoading=true;
尝试
{
等待任务。运行(异步()=>
{
等待登录服务登录(用户名、密码);
});
ShowViewModel();
}
捕获(SecurityClientException exc)
{
_dialogService.Alert(exc.Message,“登录失败”,“确定”);
}
捕获(异常exc)
{
_dialogService.Alert($“未知错误:{exc.Message}”,“登录失败”,“确定”);
}
最后
{
IsLoading=false;
}
}
// ...
}
但是,我有以下无法解决的问题:
.WithConversion(“Inverse”);