在后面的代码中设置 Xamarin.Forms 绑定 CommandParameter
Set Xamarin.Forms binding CommandParameter in code behind
我正在尝试在代码中对 TapGestureRecognizer
设置绑定,但我想不出正确的方法。工作 xaml 看起来像这样...
<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
似乎不起作用。
如果您有一个内部没有任何内容的 {Binding},它会绑定到绑定上下文并将其传递。因此,您将其绑定到页面的默认绑定上下文。
创建新绑定时设置源。
var binding = new Xamarin.Forms.Binding() { Source = this.BindingContext };
CommandProperty
绑定与您所做的相同。
由于您没有将路径传递给一些 属性 使用,您的 CommandParameterProperty
不能只创建一个空的 Binding
,因为它会抛出异常。
要解决这个问题,您需要指定 Source
属性,正如 Adam 指出的那样。
请注意,但是,如果您尝试分配 的 BindingContext
是 Null
,我怀疑这是您的情况,这将 仍然抛出异常。
下面示例中的 Grid
将 BindingContext
设置为视图模型 (objGrid.BindingContext = objMyView2
)。
然后我们为我们的命令参数创建一个新的绑定,Source
指向我们的视图模型 (Source = objGrid.BindingContext
)。
如果您 运行 下面的演示,您将在 Output
window 中看到一条调试消息,指示来自视图模型的 属性 值。
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; }
}
启动命令:-
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));
}
}
}
我正在尝试在代码中对 TapGestureRecognizer
设置绑定,但我想不出正确的方法。工作 xaml 看起来像这样...
<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
似乎不起作用。
如果您有一个内部没有任何内容的 {Binding},它会绑定到绑定上下文并将其传递。因此,您将其绑定到页面的默认绑定上下文。
创建新绑定时设置源。
var binding = new Xamarin.Forms.Binding() { Source = this.BindingContext };
CommandProperty
绑定与您所做的相同。
由于您没有将路径传递给一些 属性 使用,您的 CommandParameterProperty
不能只创建一个空的 Binding
,因为它会抛出异常。
要解决这个问题,您需要指定 Source
属性,正如 Adam 指出的那样。
请注意,但是,如果您尝试分配 的 BindingContext
是 Null
,我怀疑这是您的情况,这将 仍然抛出异常。
下面示例中的 Grid
将 BindingContext
设置为视图模型 (objGrid.BindingContext = objMyView2
)。
然后我们为我们的命令参数创建一个新的绑定,Source
指向我们的视图模型 (Source = objGrid.BindingContext
)。
如果您 运行 下面的演示,您将在 Output
window 中看到一条调试消息,指示来自视图模型的 属性 值。
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; }
}
启动命令:-
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));
}
}
}