【问题标题】:MvvmCross object data bindingMvvmCross 对象数据绑定
【发布时间】:2017-10-28 10:32:26
【问题描述】:

我是 MvvmCross 的新手,我有一个关于 Android 绑定的问题。我可以绑定到单个属性,但无法将数据绑定到对象。不知道我做错了什么,但这里是:

模型类:

 public class Login : MvxNotifyPropertyChanged
{
    private string _email;

    public string Email
    {
        get { return _email; }
        set
        {
            SetProperty(ref _email, value);
        }
    }

    public string Password { get; set; }
}

视图模型类片段:

public class LoginOptionViewModel: MvxViewModel
{

    private readonly IMvxNavigationService _navigationService;

    public LoginOptionViewModel(IMvxNavigationService navigationService)
    {
        _navigationService = navigationService;

        LoginCommand =
            new MvxAsyncCommand(async () => await _navigationService.Navigate<RegistrationViewModel>());

    }

    public IMvxAsyncCommand LoginCommand { get; set; }

    private Login _loginInfo;

    public Login LoginInfo
    {
        get
        {
            return _loginInfo ?? new Login();
        }
        set
        {
            _loginInfo = value;
            RaisePropertyChanged(() => LoginInfo);
        }
    }

}

Android Axml 片段:

<EditText
                android:id="@+id/loginEmailTxt"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/EmailHint"
                android:textColor="@color/darkNavy"
                android:inputType="textEmailAddress"
                local:MvxBind="Text LoginInfo.Email" />

我哪里出错了,我已经放置了一个断点,但没有看到它被击中。这绑定到 EditText 但似乎没有发生任何事情。为了绑定到对象属性,我是否遗漏或做错了什么?

【问题讨论】:

    标签: xamarin.android mvvmcross


    【解决方案1】:

    MvvmCross 对象数据绑定

    您可以实现MvxNotifyPropertyChanged 接口,因此系统可以通知客户端属性值已更改。

    将您的对象修改为:

    public class Login : MvxNotifyPropertyChanged
    {
        private string _email;
        public string Email
        {
            get => _email;
            set => SetProperty(ref _email, value);
        }
    }
    

    MainViewModel

    private Login _login;
    public Login Login
    {
        get
        {
            return _login ?? new Login() { Email = "=-="};
        }
        set
        {
            _login = value;
            RaisePropertyChanged(() => Login);
        }
    }
    

    然后在axml中使用:

    local:MvxBind="Text Login.Email" 
    

    对我来说效果很好。

    更新:

    我无法重现您的问题,但这是我的完整代码,希望对您有所帮助:

    public class MainViewModel : MvxViewModel
    {
        public MainViewModel()
        {
        }
    
        public override Task Initialize()
        {
            return base.Initialize();
        }
    
        public IMvxCommand ResetTextCommand => new MvxCommand(ResetText);
        private void ResetText()
        {
            Text = "Hello MvvmCross";
        }
    
        private string _text = "Hello MvvmCross";
        public string Text
        {
            get { return _text; }
            set { SetProperty(ref _text, value); }
        }
    
        private Login _login;
        public Login Login
        {
            get
            {
                return _login ?? new Login() { Email = "=-="};
            }
            set
            {
                _login = value;
                RaisePropertyChanged(() => Login);
            }
        }
    }
    
    public class Login : MvxNotifyPropertyChanged
    {
        private string _email;
        public string Email
        {
            get => _email;
            set => SetProperty(ref _email, value);
        }
    }
    

    Effect.

    【讨论】:

    • 您好,感谢您的反馈,我已经完成了您提到的操作,但仍然无法正常工作?提到我有一个单独的模型解决方案有帮助吗?如果我为 Email = "=-=" 设置一个属性,也会在 viewmodel 上设置一个属性,它会因某种原因破坏应用程序。
    • @helloworld,我已经更新了我的答案,你可以检查一下。
    • 我感觉这是由于单独的解决方案无法保持相同的 MVVM 引用。我认为不适将域放入相同的解决方案中,然后它最有可能工作
    • 您介意分享您的项目,以确保我们正在验证您正在使用的完全相同的东西吗?
    • 我注意到它正在工作,即如果我在 Login 类中的 Email 属性中放置断点,它会引发事件并且断点确实命中。但是,当我在 Login 的对象上放置断点时,ViewModel 类的断点为什么不起作用?
    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    相关资源
    最近更新 更多