本文介绍了IOS 上的 mvvmcross 绑定问题(适用于模拟器,但某些属性不适用于设备)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题在于绑定到 UIBarButtonItem,代码在模拟器上工作,但在设备上,启用属性不起作用,点击工作......

The problem consists on the binding to a UIBarButtonItem, the code works on Simulator, but on the device the property Enable doesn't work and the Clicked Works…

textViewItem 也存在同样的问题,但是这次 text 和 enable 都不起作用.

The same problem exists in the textViewItem, but this time neither the text or enable works.

    public partial class ProcessDetailViewController : MvxBindingTouchViewController<ProcessDetailViewModel>
{
    public ProcessDetailViewController (MvxShowViewModelRequest request)
        : base (request,"ProcessDetailViewController", null)
    {
    }

    public override void DidReceiveMemoryWarning ()
    {
        // Releases the view if it doesn't have a superview.
        base.DidReceiveMemoryWarning ();

        // Release any cached data, images, etc that aren't in use.
    }

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
        this.AddBindings(
            new Dictionary<object, string>()
            {
            { this.lblSeguradoraNome , "{'Text':{'Path':'AssuranceCompanyID'}}" },
            { this.lblSeguradoraGestor , "{'Text':{'Path':'AssuranceManager'}}" },
            { this.lblApoliceData , "{'Text':{'Path':'InsurancePolicyStartDate'}}" },
            { this.lblApoliceNum , "{'Text':{'Path':'InsurancePolicyNumber'}}" },
            { this.lblApoliceRamo , "{'Text':{'Path':'InsurancePolicyBranch'}}" },
            { this.lblDataPedido , "{'Text':{'Path':'RequestDate'}}" },
            { this.lblGestor , "{'Text':{'Path':'InternalManager'}}" },
            { this.lblLocalRiscoCodPostal , "{'Text':{'Path':'InsurancedLocationAddressCityZipCode'}}" },
            { this.lblLocalRiscoConcelho , "{'Text':{'Path':'InsurancedLocationAddressCity'}}" },
            { this.lblLocalRiscoMorada , "{'Text':{'Path':'InsurancedLocationAddress'}}" },
            { this.lblPerito , "{'Text':{'Path':'Surveyer'}}" },
            { this.lblSeguradoCodPostal , "{'Text':{'Path':'InsuredPersonAddressCityZipCode'}}" },
            { this.lblSeguradoConcelho , "{'Text':{'Path':'InsuredPersonAddressCity'}}" },
            { this.lblSeguradoContacto , "{'Text':{'Path':'InsuredPersonPhone'}}" },
            { this.lblSeguradoMorada , "{'Text':{'Path':'InsuredPersonAddress'}}" },
            { this.lblSeguradoNome , "{'Text':{'Path':'InsuredPersonName'}}" },
            { this.btnDownload , "{'Clicked':{'Path':'DownloadProcessButton'},'Enabled':{'Path':'HideIfDownloaded'}}" },
            { this.btnTerminarVisita , "{'Clicked':{'Path':'EndVisitButton'},'Enabled':{'Path':'ShowIfOnVisit'}}" },
            { this.btnObterLocalizacao , "{'Clicked':{'Path':'AdquireLocationButton'},'Enabled':{'Path':'ShowIfOnVisit'}}" },
            { this.btnIniciarVisita , "{'Clicked':{'Path':'BeginVisitButton'},'Enabled':{'Path':'HideIfOnVisit'}}" },
            { this.btnTirarFoto , "{'Clicked':{'Path':'TakePhotoButton'},'Enabled':{'Path':'ShowIfOnVisit'}}" },
            { this.btnVoltar , "{'Clicked':{'Path':'ReturnButton'}}" },
            { this.btnUpload , "{'Clicked':{'Path':'UploadProcessButton'},'Enabled':{'Path':'CanUpload'}}" },
            }
        );
    //  var a= NavigationItem.LeftBarButtonItems[0].Enabled

        // Perform any additional setup after loading the view, typically from a nib.
    }

    public override void ViewDidUnload ()
    {
        base.ViewDidUnload ();

        // Clear any references to subviews of the main view in order to
        // allow the Garbage Collector to collect them sooner.
        //
        // e.g. myOutlet.Dispose (); myOutlet = null;

        ReleaseDesignerOutlets ();
    }

    public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation)
    {
        // Return true for supported orientations
        return true;
    }
 }
 public class ProcessDetailViewModel : ProcessNavigationBaseViewModel
{(...)}
public class ProcessNavigationBaseViewModel : BaseViewModel
{
    (...)

    #region Properties
    private Process _currentProcess;

    private static User _user;

    private bool _isGPSLocationStarted;

    private double _latitude;

    private double _longitude;

    private string _photoFilename = "";

    public Process CurrentProcess
    {
        get
        {
            return _currentProcess;
        }
        set
        {
            _currentProcess = value;
            FirePropertyChanged(() => CurrentProcess);
        }
    }

    public User User
    {
        get { return _user; }
        set
        {
            _user = value;
            FirePropertyChanged(() => User);
        }
    }

    private bool _isDownloaded
    {
        get
        {
            return CurrentProcess.IsLockedInServer && !(CurrentProcess.ProcessState == ProcessState.WaitingReportProduction.ToString());
        }
        set
        {
            CurrentProcess.IsLockedInServer = value;
            FirePropertyChanged(() => ShowIfDownloaded);
            FirePropertyChanged(() => HideIfDownloaded);
        }
    }

    public bool ShowIfDownloaded
    {
        get { return _isDownloaded; }
    }

    public bool HideIfDownloaded
    {
        get { return !_isDownloaded; }
    }

    public bool CanUpload
    {
        get { return ( CurrentProcess.ProcessState == ProcessState.WaitingUpload.ToString()); }
    }

    public bool CanDownload
    {
        get { return (CurrentProcess.ProcessState != ProcessState.WaitingReportProduction.ToString() &&
                                    CurrentProcess.ProcessState == ProcessState.WaitingSurveyorAcceptionDecision.ToString()) ;  }
    }

    public bool ShowIfOnVisit
    {
        get { return (CurrentProcess.ProcessState == ProcessState.OnVisist.ToString()); }
    }

    public bool HideIfOnVisit
    {
        get { return (!(CurrentProcess.ProcessState == ProcessState.OnVisist.ToString())) && ShowIfDownloaded; }
    }

    public string ProcessDescription
    {
        get
        {
            return string.Format("{0} - {1}", CurrentProcess.ProcessNumber, CurrentProcess.RequestedService.RequestedServiceType);
        }
    }
(...)
 }

提前致谢


Thanks in advance

应用程序输出:2013-01-11 09:16:56.369 LinkFENACAMSIGEPMobileUIIPad[6496:c07]导航:诊断:2.24 使用 args 导航到 MainMenuViewModel

The Application Output:2013-01-11 09:16:56.369 LinkFENACAMSIGEPMobileUIIPad[6496:c07]Navigation: Diagnostic: 2.24 Navigate to MainMenuViewModel with args

2013-01-11 09:16:56.369 LinkFENACAMSIGEPMobileUIIPad[6496:c07]触摸导航:诊断:2.24 导航请求

2013-01-11 09:16:56.369 LinkFENACAMSIGEPMobileUIIPad[6496:c07]TouchNavigation: Diagnostic: 2.24 Navigate requested

2013-01-11 09:16:56.421 LinkFENACAMSIGEPMobileUIIPad[6496:c07]MvxBind:警告:2.29 无法绑定到源为空

2013-01-11 09:16:56.421 LinkFENACAMSIGEPMobileUIIPad[6496:c07]MvxBind: Warning: 2.29 Unable to bind to source is null

2013-01-11 09:16:56.423 LinkFENACAMSIGEPMobileUIIPad[6496:c07]MvxBind:警告:2.29 无法绑定到源为空

2013-01-11 09:16:56.423 LinkFENACAMSIGEPMobileUIIPad[6496:c07]MvxBind: Warning: 2.29 Unable to bind to source is null

- 链接器行为:仅链接 SDK 程序集

类似于:MvvmCross Monotouch- 无法在真正的 iPad 上绑定属性,但它可以在模拟器上运行(我不能让它工作......)

Similiar To:MvvmCross Monotouch - Fail to bind Properties on a real iPad, but it works on the Simulator (I Can't make this work...)

推荐答案

我在包含的示例代码中看不到栏按钮 - 所以我将根据文本、点击、启用等进行回答.

I can't see the barbutton in the example code included - so I'll answer based on the Text, Clicked, Enabled, etc.

如果这在模拟器中有效,但在设备上无效,则很可能与链接器有关 - 与 MvvmCross Monotouch - 无法在真正的 iPad 上绑定属性,但可以在模拟器上使用

If this is working in Simulator, but not on the device, the chances are this is to do with the Linker - exactly like in MvvmCross Monotouch - Fail to bind Properties on a real iPad, but it works on the Simulator

要测试这个理论,请尝试将链接器转为包含所有符号

To test this theory, try turning the linker to include all symbols

假设这是问题的原因...然后要解决此问题,您需要包含一个 LinkerPleaseInclude.cs 文件,该文件将诱使链接器包含这些属性.

Assuming this is the cause of the problem... then to workaround it you need to include a LinkerPleaseInclude.cs file which will trick the Linker into including these properties.

例如它可能看起来像:

public class LinkerIncludePlease
{
    private void IncludeClicked(UIButton button)
    {
        button.Clicked += (s, e) => { };
    }

    private void IncludeEnabled(UIButton button)
    {
        button.Enabled = !button.Enabled;
    }

    private void IncludeText(UILabel label)
    {
        label.Text = label.Text + "test";
    }
}

注意:此代码从未真正执行过,而是在构建时由链接器分析.

Note: that this code is never actually executed, but is analysed by the Linker at build time.

这篇关于IOS 上的 mvvmcross 绑定问题(适用于模拟器,但某些属性不适用于设备)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-27 01:18