[最初发布于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; }
}
答案 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