2016-02-06 2 views
4

Я пытаюсь установить привязку в TapGestureRecognizer в коде, и я не могу понять, как это сделать. Работает XAML выглядит примерно так ...Настройка привязки Xamarin.Forms в коде за

<Grid> 
    <Grid.GestureRecognizers> 
     <TapGestureRecognizer Command="{Binding LaunchLocationDetailsCommand}" CommandParameter="{Binding}" /> 
    </Grid.GestureRecognizers> 
</Grid> 

И в C#, это выглядит примерно так ...

var gridTap = new TapGestureRecognizer(); 
gridTap.SetBinding(TapGestureRecognizer.CommandProperty, new Binding("LaunchLocationDetailsCommand")); 
gridTap.SetBinding(TapGestureRecognizer.CommandParameterProperty, new Binding(/* here's where I'm confused */)); 

var grid = new Grid(); 
grid.GestureRecognizers.Add(gridTap); 

Моя путаница приходит на связывание CommandParameterProperty. В xaml это просто {Binding} без других параметров. Как это делается в коде? Передача в new Binding() или this.BindingContext не работает.

ответ

2

CommandProperty связывание такой же, как ты делал.

Поскольку вы не проходите путь к некоторому используемому объекту, ваш CommandParameterProperty не может просто создать пустой Binding, поскольку он выдает исключение.

Чтобы обойти это, вам необходимо указать Source недвижимость, указанную Адамом.

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

Grid в приведенном ниже примере имеет BindingContext модель к представлению модели (objGrid.BindingContext = objMyView2).

Мы создаем новое связывание для нашего параметра команды, с Source, указывающим на нашу модель представления (Source = objGrid.BindingContext).

Если вы запустите демонстрационную версию ниже, вы увидите отладочное сообщение в окне Output, указывающее значение свойства из модели представления.

 MyView2 objMyView2 = new MyView2(); 
     objMyView2.SomeProperty1 = "value1"; 
     objMyView2.SomeProperty2 = "value2"; 

     objMyView2.LaunchLocationDetailsCommand_WithParameters = new Command<object>((o2)=> 
     { 
      LaunchingCommands.LaunchLocationDetailsCommand_WithParameters(o2); 
     }); 

     Grid objGrid = new Grid(); 
     objGrid.BindingContext = objMyView2; 
     objGrid.HeightRequest = 200; 
     objGrid.BackgroundColor = Color.Red; 

     TapGestureRecognizer objTapGestureRecognizer = new TapGestureRecognizer(); 
     objTapGestureRecognizer.SetBinding(TapGestureRecognizer.CommandProperty, new Binding("LaunchLocationDetailsCommand_WithParameters")); 

     Binding objBinding1 = new Binding() 
     { 
      Source = objGrid.BindingContext 
     }; 
     objTapGestureRecognizer.SetBinding(TapGestureRecognizer.CommandParameterProperty, objBinding1); 
     // 
     objGrid.GestureRecognizers.Add(objTapGestureRecognizer); 

Вспомогательные классы: -

MyView2: -

public class MyView2 
    : ViewModelBase 
{ 
    public string SomeProperty1 { get; set; } 
    public string SomeProperty2 { get; set; } 

    public ICommand LaunchLocationDetailsCommand_WithParameters { get; set; } 
} 

LaunchingCommands: -

public static class LaunchingCommands 
{ 
    public static void LaunchLocationDetailsCommand_WithParameters(object pobjObject) 
    { 
     System.Diagnostics.Debug.WriteLine("SomeProperty1 = " + (pobjObject as MyView2).SomeProperty1); 
    } 
} 

ViewModelBase: -

public abstract class ViewModelBase 
    : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void RaisePropertyChanged(string pstrPropertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(pstrPropertyName)); 
     } 
    } 

} 
0

Если у вас есть {Binding}, в котором нет ничего, он привязан к контексту привязки и передает его. Следовательно, вы привязываете его к контексту привязки по умолчанию к странице.

Когда вы создаете новое связывание, установите источник.

var binding = new Xamarin.Forms.Binding() { Source = this.BindingContext }; 
+0

Как я уже упоминал в своем вопросе, вы не можете проходить в BindingContext так, как я пытаюсь. Как вы предлагаете это делать? – tarrball

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