Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在mvvmcross中正确注册自定义绑定?_C#_Xamarin_Mvvmcross - Fatal编程技术网

C# 如何在mvvmcross中正确注册自定义绑定?

C# 如何在mvvmcross中正确注册自定义绑定?,c#,xamarin,mvvmcross,C#,Xamarin,Mvvmcross,我试图在mvvmcross中使用UIActivityIndicatorView的自定义绑定,但无法使其正常工作。 我听从了建议。因此,我创建了自定义活页夹类: public class ActivityIndicatorViewHiddenTargetBinding : MvxConvertingTargetBinding { public ActivityIndicatorViewHiddenTargetBinding(UIActivityIndicatorView target)

我试图在mvvmcross中使用UIActivityIndicatorView的自定义绑定,但无法使其正常工作。 我听从了建议。因此,我创建了自定义活页夹类:

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”);
  • 当我将断点放入ActivityIndicatorViewWhiddenTargetBinding类中的SetValueImpl方法时,未命中
  • 我对mvvmcross和Xamarin都是新手。有人知道代码出了什么问题吗