2014-09-18 3 views
9

Я хотел бы передать Xamarin.Forms.Button в свой собственный Command как CommandParameter в мою ViewModel. Я знаю, как это сделать из кода, расположенного, например, ...Как передать кнопку в качестве параметра CommandParameter из XAML на странице Xamarin.Forms?

XAML(с большинством свойств пропускали для краткости)

<Button x:Name="myButton" 
    Text="My Button" 
    Command="{Binding ButtonClickCommand}"/> 

XAML.cs

public partial class MyTestPage 
{ 
    public MyTestPage() 
    { 
     InitializeComponent(); 

     myButton.CommandParameter = myButton; 
    } 
} 

ViewModel

public class MyViewModel : ViewModelBase 
{ 
    public MyViewModel() 
    { 
     ButtonClickCommand = new Command(
      (parameter) => 
      { 
       var view = parameter as Xamarin.Forms.Button; 
       if (view != null) 
       { 
        // Do Stuff 
       } 
      }); 
    } 

    public ICommand ButtonClickCommand { get; private set; } 
} 

... НО можно ли объявить CommandParameter в самой XAML? Или, другими словами, какой синтаксис привязки задает параметр самой кнопке?

<Button x:Name="myButton" 
     Text="My Button" 
     Command="{Binding ButtonClickCommand}" 
     CommandParameter="{[WHAT WOULD GO HERE]}"/> 

Кстати я уже пробовал CommandParameter="{Binding RelativeSource={RelativeSource Self}}" и это не сработало.

Спасибо,

+0

Зачем вам нужна кнопка на вашей виртуальной машине? –

+0

Привет @AlexAnderson. Да, я тоже не слишком обожаю. Мы представляем Xamarin.Forms в существующий проект Xamarin iOS. Просто экспериментируйте с способами получения собственного UIPopoverController для показа с страницы Xamarin.Form. Нет поддержки форм для всплывающих окон, поэтому просто глядя на пути вокруг этого на данный момент, и одно из препятствий - мне нужно знать, какой UIElement отображать всплывающее окно ... поэтому передавая кнопку. Как я уже сказал ... вроде бы чувствует себя. Я попробую ваше предложение ниже. Спасибо –

+0

Что касается всплывающих окон, ознакомьтесь с реализацией 'ContentPage.DisplayActionSheet (...)' - если лист действий недостаточно, вы можете перепроектировать код, который показывает его. И получение ссылки Button по-прежнему требует поиска ссылки UIButton. Вам будет лучше с помощью специального рендеринга –

ответ

-1
<Button x:Name="myButton" 
    Text="My Button" 
    Command="{Binding ButtonClickCommand}" 
    CommandParameter={Binding RelativeSource= 
           {RelativeSource 
           Mode=FindAncestor, 
           AncestorType={x:Type Button}}/> 

Должно работать, но им все еще в недоумении, почему вам нужна кнопка? Точка MVVM - это разделение данных и пользовательского интерфейса. все, что вам нужно сделать для кнопки, можно сделать с помощью DataBindings.

Если выше не работает, только другая вещь, чтобы попытаться это дать кнопку в х: Key и CommandParamter = {StaticResource «х: Key»}

+1

Связи Xamarin.Forms не имеют никакого свойства RelativeSource, а также расширения разметки RelativeSource. –

+0

Привет @AlexAnderson ... да, ни один из этих предложений не работал. Я боюсь. –

16

Xamarin.Forms имеет расширение Ссылка разметки, который делает только что :

<Button x:Name="myButton" 
    Text="My Button" 
    Command="{Binding ButtonClickCommand}" 
    CommandParameter="{x:Reference myButton}"/> 

Хотя, это первый раз, когда я вижу эту потребность, и вы, вероятно, лучше разделить ваши взгляды от ваших ViewModels и решить эту проблему с помощью чистого шаблона, или не обмена команды через кнопки.

+0

Привет @StephaneDelcroix. К сожалению, это тоже не сработало. «Исключение было вызвано целью вызова». –

+0

Вы могли бы поделиться трассировкой стека?вы используете xaml 2009 xmlns? вы используете последнюю версию (1.2.2 или 1.2.3-pre2) версии XF? –

+0

Извините @GavinSutherland, но я только что проверил это на 1.2.3-pre-2, и он работает так, как ожидалось. –