Xamarin.Forms Data将Button.CommandParameterProperty绑定到Code Behind中的Entry.Text

时间:2015-10-19 06:13:55

标签: c# xamarin.forms

[最初发布于Xamarin论坛https://forums.xamarin.com/discussion/53638/data-bind-button-commandparameterproperty-to-entry-text-in-code-behind;重新发布在这里]

请翻译以下内容(来自https://forums.xamarin.com/discussion/43904/how-to-pass-multiple-parameters-using-command-interface

<StackLayout x:Name="entryForm" >
  <Entry x:Name="nameEntry" Placeholder="Name" Keyboard="Default" />
  <Button x:Name="loginButton"
          Text="Login"
          Command="{Binding LoginCommand}"
          CommandParameter="{Binding Source={x:Reference nameEntry}, Path=Text}"  /> 
</StackLayout>

如何在代码中实现它;具体来说,如何将loginButton.CommandParameter数据绑定到nameEntry.Text,以便它(文本)作为参数传递给ViewModel中的Command:

public class LoginViewModel : ViewModelBase {
    public LoginViewModel() {
        LoginCommand = new Command<string>(execute: (string parameter) => 
        {
            //do something with the string username
        });
    }

public ICommand LoginCommand { get; private set; }
}

1 个答案:

答案 0 :(得分:0)

不完全确定你在这里寻找什么,所以这个答案有点长。 我的第一个猜测是你在IDE中加载了这两个代码块,没有任何反应,你想知道原因。该示例中唯一缺少的代码块是XAML页面后面的代码,应该读取。

using System;
using System.Collections.Generic;

using Xamarin.Forms;

namespace LoginFormExample
{
    public partial class LoginViewPage : ContentPage
    {
        public LoginViewPage ()
        {
            InitializeComponent ();
            BindingContext = new LoginViewModel();
        }
    }
}

您可能正在寻找的另一个可能的答案是抛弃XAML并将整个内容翻译成代码,如果这就是页面的情况:

using System;

using Xamarin.Forms;

namespace LoginFormExample
{
    public class LoginViewFormInCS : ContentPage
    {
        public LoginViewFormInCS ()
        {
            BindingContext = new LoginViewModel();
            Entry myEntry = new Entry ();
            Button myButton = new Button ();
            myButton.SetBinding (Button.CommandProperty, new Binding ("LoginCommand", 0)); 
            Content = new StackLayout { 
                Children = {
                    new StackLayout()
                    {
                        Children=
                        {
                            myEntry,
                            myButton
                        }
                    }
                }
            };
        }
    }
}

所有这些都说明MVVM中的这些例子中没有一个是真的。命令参数应该用于那些不属于你的模型并且不应该属于模型的东西。我几乎从不使用它。如果你没有使用MVVM那么它会更多地发挥作用。原因是用户名和ViewModel可能需要做出决策的View的任何其他数据元素应绑定到Viewmodel中的某些内容。对于这个例子,像

查看:

<?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="LoginFormExample.LoginViewPage2">
    <ContentPage.Content>
    <StackLayout x:Name="entryForm" >
  <Entry x:Name="nameEntry" Placeholder="Name" Keyboard="Default" Text="{Binding Name}"/>
  <Button x:Name="loginButton"
          Text="Login"
          Command="{Binding LoginCommand2}"
          /> 
</StackLayout>
    </ContentPage.Content>
</ContentPage>

视图模型:

using System;
using Xamarin.Forms;
using System.Windows.Input;

namespace LoginFormExample
{
    public class LoginViewModel2
    {
        public LoginViewModel2() {

            LoginCommand2 = new Command<string>((string parameter) => 
                {
                    System.Diagnostics.Debug.WriteLine(Name);
                    //do something with the string username
                });
        }

        public string Name{ get; set; }
        public ICommand LoginCommand2 { get; private set; }
    }
}

XAML代码背后:

using System;
using System.Collections.Generic;

using Xamarin.Forms;

namespace LoginFormExample
{
    public partial class LoginViewPage : ContentPage
    {
        public LoginViewPage ()
        {
            InitializeComponent ();
            BindingContext = new LoginViewModel();
        }
    }
}

如果它有助于代码结束: https://github.com/DavidStrickland0/Xamarin-Forms-Samples/tree/master/LoginSample