在代码隐藏中设置 Xamarin.Forms 绑定 CommandParameter

本文关键字:Forms 绑定 CommandParameter Xamarin 设置 代码 隐藏 | 更新日期: 2023-09-27 18:33:24

我正在尝试在代码中的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似乎不起作用。

在代码隐藏中设置 Xamarin.Forms 绑定 CommandParameter

CommandProperty绑定与您之前相同。

由于您没有传递到要使用的某个属性的路径,因此您的CommandParameterProperty不能只创建一个空Binding因为它会引发异常。

要解决此问题,您需要指定 Source 属性,正如 Adam 所指出的那样。

请注意,但是,如果您尝试分配的BindingContext Null ,我怀疑这是在您的情况下,这仍然会引发异常。

以下示例中的GridBindingContext设置为视图模型 ( 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);

支持课程:-

我的视图2:-

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);
    }
}

视图模型库:-

public abstract class ViewModelBase
    : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged(string pstrPropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(pstrPropertyName));
        }
    }
}

如果你有一个 {Binding},里面没有任何内容,它就会绑定到绑定上下文并将其传递。因此,将其绑定到页面的默认绑定上下文。

创建新的绑定时,设置源。

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