如何将条目参数传递给 Xamarin MVVM 视图模型

Posted

技术标签:

【中文标题】如何将条目参数传递给 Xamarin MVVM 视图模型【英文标题】:How do I pass entry parameters to Xamarin MVVM viewmodel 【发布时间】:2018-03-15 03:22:32 【问题描述】:

我正在寻找通过单击带有命令参数的按钮(在视图中)将条目参数(用户名、密码)传递给 Xamarin MVVM 视图模型的最佳方法。

【问题讨论】:

【参考方案1】:

这是在 Xamarin MVVM 模式中传递用户名和密码的示例。它工作正常:

1) 创建一个包含您的命令的 LoginViewModel。确保 ViewModel 实现 INotifyPropertyChanged:

public class LoginViewModel:INotifyPropertyChanged

    private ObservableCollection<CredentialsModel> _listOfItems=new 
    ObservableCollection<CredentialsModel>();
    public ObservableCollection<CredentialsModel> ListOfItems
    
        get  return _listOfItems; 
        set
        
            if (_listOfItems != value)
            
                _listOfItems = value;
                RaisePropertyChanged();
            
        
    
    private string username = null;
    private string password = null;
    private string loginMessage = null;
    public string Username  get  return username;  set  username = 
    value;  
    public string Password  get  return password;  set  password = 
    value;  
    public string LoginMessage  get  return loginMessage;  set  
    loginMessage = value; RaisePropertyChanged();  

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged([CallerMemberName]string caller="")
    
        if(PropertyChanged!=null)
        
            PropertyChanged(this, new PropertyChangedEventArgs(caller));
        
    

    public ICommand LoginCommand
    
        get;
        private set;
    

    public LoginViewModel()
    
        ListOfItems.Add(new CredentialsModel());
        LoginCommand = new Command((e) =>
        
            var item = (e as CredentialsModel);
            //TODO: LOGIN TO YOUR SYSTEM
            loginMessage = string.Concat("Login successful for user: ", 
            item.Username);
        );
    
 

2) 在您的 LoginView 的标记中,为您的 ListView 指定一个名称,以便您可以从 List 项访问 LoginCommand

3) 将Button 的Command 属性绑定到LoginView 中的LoginCommand。确保将其命令源设置为 ListView 使用的 BindingContext,它将指向 LoginViewModel。并将 Button 的 CommandParameter 绑定到当前列表项:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class LoginView : ContentPage

    public LoginView()
    
        InitializeComponent();
        BindingContext = new LoginViewModel();
    




<?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="MyApp.View.LoginView">
    <ContentPage.Content>
    <StackLayout>
        <control:MenuView />
        <ListView x:Name="LoginList" ItemsSource="Binding ListOfItems, 
           Mode=TwoWay" SeparatorVisibility="None">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal">
                            <Entry Placeholder="Enter user name" Text="
                              Binding Username, Mode=TwoWay" 
                              x:Name="Username"/>
                            <Entry Placeholder="Enter password" Text="
                              Binding Password, Mode=TwoWay"  
                               x:Name="Password" />
                            <Button Text="Login" 
                                    Command="Binding 
                                    Path=BindingContext.LoginCommand, 
                                    Source=x:Reference LoginList"
                                    CommandParameter="Binding">
                            </Button>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <Label Text="Binding LoginMessage"></Label>
     </StackLayout>
     </ContentPage.Content>
   </ContentPage>

【讨论】:

【参考方案2】:

这个 repo 可能对你有帮助

https://github.com/deanilvincent/Xamarin-Forms-Simple-MVVM-Login

如果您不熟悉 xamarin 形式的 MVVM,此链接也可能对您有所帮助。

Basic Understanding How Data Binding and MVVM works in Xamarin Forms

【讨论】:

以上是关于如何将条目参数传递给 Xamarin MVVM 视图模型的主要内容,如果未能解决你的问题,请参考以下文章

如何将相同的viewmodel设置为xamarin表单中的新mvvm中的两个视图

如何在一个条目中将RGB作为单独的参数传递给函数

使用 Microsoft.Toolkit.Mvvm 和 Microsoft.Xaml.Behaviors.Wpf 将事件参数传递给命令

MVVM - 如何将上下文传递给存储库类?

如何将 UDF 的输入参数传递给 sapply

Xamarin 将字符串添加到 mvvm 中的条目