【问题标题】:MvvmCross Binding UWPMvvmCross 绑定 UWP
【发布时间】:2017-07-18 14:48:21
【问题描述】:

我创建了按预期工作的 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>

和视图模型

        public string Login { get; set; }

        public string Password { get; set; }

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

当按下登录按钮时,它成功进入给定的方法,但登录和密码字符串为空。相同的代码适用于带有 MvxBind 登录和密码字符串的 Android。

我会做些破旧的事吗?

【问题讨论】:

  • 您在使用 Fody PropertyChanged 吗?如果是这种情况,请确保 UWP 项目中的 wave xml 正确
  • 顺便说一句,如果你不展示你是如何进行绑定的,人们将无法提供太多帮助

标签: c# xamarin uwp mvvmcross


【解决方案1】:

当登录按钮被按下时,它成功进入给定的方法,但登录和密码字符串为空

在您的代码中,我不知道您已经实现了 Login 属性 set get 方法。你也没有包括RaisePropertyChanged(() =&gt; )。因此,您可以尝试使用下面的代码并检查它是否有效。同时你可以参考我上传的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}));
        }
    }
}

【讨论】:

    【解决方案2】:

    我知道这是 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

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

    【讨论】:

      【解决方案3】:

      就 WPF 而言,您的 ViewModel 属性需要实现 System.ComponentModel 中的 INotifyPropertyChanged,以便绑定更新 UI。将这段代码添加到您的视图模型中并修改您的属性,如下面的登录所示:

      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");
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-17
        • 2014-10-10
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多