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));
}
}
}
Как я уже упоминал в своем вопросе, вы не можете проходить в BindingContext так, как я пытаюсь. Как вы предлагаете это делать? – tarrball