Xamarin表示XAML ContextAction绑定到ViewCell中的C#

时间:2016-08-14 15:00:50

标签: c# xaml binding xamarin.forms

我有以下XAML工作绑定到我的视图模型中的删除命令:

@org.springframework.context.annotation.Configuration
@EnableTransactionManagement
@EnableNeo4jRepositories(basePackages = "com.seyfert.matrix.graph.repository")
public class DBConfig extends Neo4jConfiguration{
...

我正在尝试将其转换为C#,因此我可以通过编程方式使用它。

我尝试过以下但是没有用。需要改变什么?是否有更好/不同的方式来访问ViewModel DeleteCommand?

        <TextCell.ContextActions>
          <MenuItem Command="{Binding Path=BindingContext.DeleteCollectionCommand, Source={x:Reference Name=CollectionListView}}"
                    CommandParameter="{Binding .}"
                    Text="Delete" 
                    IsDestructive="True" />
        </TextCell.ContextActions>

修改

我能够通过结合skar的答案并从父视图中初始化Cell来实现这一点:

    protected override void OnBindingContextChanged()
    {
        base.OnBindingContextChanged();

        var deleteAction = new MenuItem { Text = "Delete", IsDestructive = true }; // red background
        deleteAction.SetBinding(MenuItem.CommandParameterProperty, new Binding("."));
        deleteAction.SetBinding(MenuItem.CommandProperty,
            new Binding("BindingContext.DeleteCommand", BindingMode.Default, null, null, null, "{x:Reference Name=CollectionBeerListView}"));

        ContextActions.Add(deleteAction);
    }

不确定这是否理想......但让我感动。

1 个答案:

答案 0 :(得分:0)

我通过向我的(自定义)视单元添加一个 ParentContext 属性来解决这个问题。使用 AncestorType 将该属性设置为 ViewModel,如下所示:

ParentContext="{Binding ., Source={RelativeSource AncestorType={x:Type local:MyViewModel}}}" 

我的自定义视单元:

public static readonly BindableProperty ParentContextProperty = BindableProperty.Create("ParentContext", typeof(object), typeof(CustomViewCell), null, BindingMode.OneTime);
    public object ParentContext
    {
        get { return GetValue(ParentContextProperty); }
        set { SetValue(ParentContextProperty, value); }
    }

然后在我的视单元中,我通过引用视单元 x:Name 添加了 contextaction 并且它有效:)

<ViewCell.ContextActions>
<MenuItem 
    Command="{Binding ParentContext.TheCommand, Source={x:Reference customViewCellName}}" 
    CommandParameter="{Binding Id}"
    Text="Some text">
</MenuItem>
</ViewCell.ContextActions>