簡體   English   中英

MvvmCross 綁定 UWP

[英]MvvmCross Binding UWP

我已經創建了按預期工作的 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; }
//...

當按下登錄按鈕時,它成功進入給定的方法,但登錄和密碼字符串為空。 相同的代碼適用於 Android,在登錄和密碼字符串上使用 MvxBind。

我做點什么嗎?

當按下登錄按鈕時,它成功進入給定的方法,但登錄和密碼字符串為空

在你的代碼中,我沒有意識到你已經實現了Login屬性set get方法。 您都沒有包括RaisePropertyChanged(() => ) 所以你可以嘗試使用下面的代碼並檢查它是否有效。 同時你可以參考我上傳的項目

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

我知道這是 4 年前,但對於未來的讀者,在 UWP Passwordbox 中不公開 Password DP 的原因是在內存中有密碼是不安全的。

所以你應該違反 mvvm 並從后面的代碼中將密碼放入數據庫中。 這是一些有用的鏈接:

如何綁定到 MVVM 中的 PasswordBox http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html

此外,如果您堅持公開密碼,您可以創建自己的控件。

一般說到 WPF,您的 ViewModel 屬性需要實現System.ComponentModel中的INotifyPropertyChanged ,以便綁定更新 UI。 將這段代碼添加到您的視圖模型並重新修改您的屬性,如下面的 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");
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM