2015-10-19 1 views
0

[Первоначально опубликовано на форумах Xamarin https://forums.xamarin.com/discussion/53638/data-bind-button-commandparameterproperty-to-entry-text-in-code-behind; повторное размещение здесь]Xamarin.Forms Data bind Button.CommandParameterProperty to Entry.Text в коде за

Пожалуйста перевести следующее (из 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:

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

Не совсем уверен, что ищете здесь, так что этот ответ получает немного долго , My First Guess - вы загрузили эти два куска кода в свою 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 может потребовать для принятия решений, должен быть привязан к чему-то в 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> 

ViewModel:

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

+0

Спасибо за ваш ответ. Я просто использовал этот код в качестве примера, потому что он иллюстрирует мою проблему. Мой вопрос, точнее, можно связать с 'CommandParameterProperty' кнопки, которая в примере привязана как таковая в XAML: ' CommandParameter = "{Binding Source = {x: Reference nameEntry}, Path = Text} "' Как это привязка выполняется, если пользовательский интерфейс создается только в коде (а не XAML)? В частности, я хочу передать значение, введенное в 'nameEntry', в' LoginCommand'. – mrtnkrstn

+0

Подумайте, что это уже разрешилось на форуме Xamarin. Если кто-то еще спотыкается об этом и ищет его, см.: Http://forums.xamarin.com/discussion/comment/159941#Comment_159941 – David

+0

Действительно, это сработало, спасибо! – mrtnkrstn