2016-04-07 5 views
-1

У меня есть мнение с изображением, которое имеет водопроводную жест, связанный с командой:Могу ли я получить связанный элемент изнутри в форме Xamarin?

ВИД:

var clickableImage = new Image(...); 
var imageTap = new TapGestureRecognizer(); 
clickableImage.GestureRecognizers.Add(imageTap); 
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandProperty, _ => _.MyCommand); 

Команда в модели представления, как это:

VIEW МОДЕЛЬ

public ICommand MyCommand 
{ 
    get 
    { 
     return new Command((parameters) => 
     {    
      // Can I access imageTap element here? 
     }); 
    } 
} 

Есть ли какой-либо способ ss элемент imageTap из команды, к которой он привязан?

+2

Кто бы ни отклонил - скажите, пожалуйста, почему. Я ничего не узнаю, если вы без колебаний объясняете. – jbyrd

+0

Другие опубликовали решения о том, как вы можете добиться этого с помощью параметра команды, я просто добавлю, что вам следует, вероятно, переосмыслить, почему вы делаете это в первую очередь. Команда находится внутри ViewModel, ViewModel не должен знать ваше мнение, только наоборот. MVVM имеет чистое разделение этих слоев, и вы идете по всему, что если вы передаете ссылки на изображение или в зависимости от пространства имен Xamarin.Forms вообще в модели представления – irreal

+0

@irreal - так, у меня есть пользовательский элемент (в основном блок с значком и различными битами текста), который имеет 4 варианта. Основываясь на этом варианте, я хочу, чтобы команда делала несколько разные вещи, поэтому команда должна знать, какова вариация моего пользовательского элемента. Передав элемент в параметр команды, я могу это сделать. Это имеет смысл сейчас, или вы все еще думаете, что мой подход проблематичен? – jbyrd

ответ

1

Да, вы можете использовать параметр команды.

Вы можете направить этот ответ/сообщение от одного из наших инженеров по команде Форм. https://stackoverflow.com/a/25914911/85606

imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandProperty, _ => _.MyCommand); 
//Command parameter 
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandParameterProperty, _ => imageTap); 

CommandParameter еще один Привязываемое свойство на TapGestureRecognizer, вы можете установить его на другую линию.

+0

Хм, как бы это выглядело в коде C# (против XAML)? И внутри самой команды, как я могу ссылаться на связанный элемент? – jbyrd

+0

@jbyrd see my edit –

+0

Когда я пытаюсь это сделать, я получаю сообщение об ошибке «Указанный приведение недействителен», непосредственно связанный с линией CommandParameterProperty. – jbyrd

1

Чтобы объяснить немного более подробно, когда вы используете CommandParameter, объект, который вы связываете, получает в качестве параметра для действия вашей команды при его запуске. Затем вы должны указать параметр в желаемый тип, чтобы использовать его или изменить.

Например, если вы хотите, чтобы получить ссылку на элемент изображения из вашей команды, которые вы бы создали вы контролируете, как так:

var clickableImage = new Image (...); 
var imageTap = new TapGestureRecognizer(); 
clickableImage.GestureRecognizers.Add(imageTap); 
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandProperty, _ => _.MyCommand); 
imageTap.SetBinding<MyViewModel>(TapGestureRecognizer.CommandParameterProperty, _ => clickableImage); // clickableImage will be passed to MyCommand when it is run 

Тогда в классе MyViewModel, вы бы настроить команду например:

public ICommand MyCommand 
{ 
    get 
    { 
     return new Command((parameter) => // the bound parameter (the Image element in this case) is passed in as an object 
     {    
      var clickableImage = (Image)parameter; // cast the parameter object to an Image. 
      // Use the element for whatever you need 
      ... 
     }); 
    } 
} 
+0

Когда я пытаюсь это сделать, я получаю сообщение об ошибке «Указанный приказ недействителен», непосредственно связанный с линией CommandParameterProperty. – jbyrd

+0

О, это было бы потому, что он ищет свойство в классе MyViewModel и clickableImage не является свойством и не является в MyViewModel. Можете ли вы поделиться немного больше информации о том, чего вы хотите достичь? Как правило, ViewModel не должен знать представление в строгом смысле MVVM. Я был бы рад помочь, если я знаю, какова ваша конечная цель. –

 Смежные вопросы

  • Нет связанных вопросов^_^