MvvmCross绑定UWP

时间:2017-02-27 20:23:53

标签: c# xamarin uwp mvvmcross

我创建的Android应用程序正常运行。现在我添加了UWP项目,如MvvmCross网站所示。

问题是绑定在那里不起作用。

有我的XAML:

  <Grid Row="1" >
            <StackPanel VerticalAlignment="Center"
                        Margin="40 0 40 0">
                <TextBox Text="{Binding Login}"
                         Margin="0 0 0 20"/>
                <PasswordBox Password="{Binding Password}"/>
            </StackPanel>
            <Button VerticalAlignment="Bottom"
                    Content="Login"
                    Command="{Binding LoginCommand}"
                    Foreground="#F9F9F9"
                    HorizontalAlignment="Stretch"
                    Background="#FF4081"/>
        </Grid>

和ViewModel

        public string Login { get; set; }

        public string Password { get; set; }

        public MvxCommand LoginCommand { get; private set; }
//...

按下“登录”按钮后,它会成功进入给定方法,但“登录”和“密码”字符串为空。相同的代码适用于Android,在登录名和密码字符串上使用MvxBind。

我能做些什么吗?

3 个答案:

答案 0 :(得分:0)

  

按下Login按钮后,它会成功进入给定方法,但Login和Password字符串为空

在您的代码中,我无法识别您已实施Login属性set get方法。你们都没有包括RaisePropertyChanged(() => )。所以你可以尝试使用下面的代码并检查它是否有效。在此期间,您可以参考我上传的project

public class MainViewModel : MvxViewModel
{
    private string _login;
    private string _password;

    public string Login
    {
        get { return _login; }
        set { _login = value; RaisePropertyChanged(() => Login); }
    }

    public string Password
    {
        get { return _password; }
        set { _password = value; RaisePropertyChanged(() => Password); }
    }

    public ICommand LoginAction
    {
        get
        {
            return new MvxCommand(() => ShowViewModel<HomeViewModel>(new {Login,Password}));
        }
    }
}

答案 1 :(得分:0)

我知道这是 4 年前,但对于未来的读者,在 UWP Passwordbox 中不公开 Password DP 的原因是在内存中有密码是不安全的。

所以你应该违反 mvvm 并从后面的代码中将密码放入数据库中。 这里有一些有用的链接:

How to bind to a PasswordBox in MVVM http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html

此外,如果您坚持公开密码,您可以创建自己的控件。

答案 2 :(得分:-1)

一般说到WPF,您的ViewModel属性需要实现INotifyPropertyChanged中的System.ComponentModel,以便绑定更新UI。将这段代码添加到您的viewmodel并重新修改您的属性,如下面的Login所示:

public class ViewModel:INofifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void notifyPropertyChanged(string name)
    {
        if(PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }

    private string _login;
    public string Login
    {
        get
        {
            return _login;
        }
        set
        {
            _login = value;
            notifyPropertyChanged("Login");
        }
    }
}