如何在代码中执行相当于{Binding Source}的操作?

时间:2016-03-05 00:59:26

标签: xaml xamarin.forms

我正在扩展一个控件,以便能够在我当前的Xamarin项目中重用它。作为此控件的一部分,我需要以编程方式创建DataTemplate。我已经找到了这个部分并且工作正常。

DataTemplate中有一个Label。我需要将Label的BindingContext属性绑定到{Binding Source}。我需要将Label的Text属性绑定到{Binding Path=Name}

这适用于XAML,但我不想将其复制到代码库中的百万个不同位置。

<dxGrid:TemplateColumn FieldName="MyPropertyName"
                    Caption="MyColumn">
<dxGrid:TemplateColumn.DisplayTemplate>
    <DataTemplate>
        <Label BindingContext="{Binding Source}"
                Text="{Binding Source, Path=MyPropertyName}" />
    </DataTemplate>
</dxGrid:TemplateColumn.DisplayTemplate>

我的扩展控件现在看起来像这样:

public class MyColumn : TemplateColumn
{
    public MyColumn()
    {
        DataTemplate displayTemplate = new DataTemplate(() =>
        {
            BindingBase textBinding = new Binding(FieldName);

            Label label = new Label();

            // TODO: Bind BindingContextProperty to {Binding Source}
            //label.SetBinding(BindingContextProperty, binding);

            label.SetBinding(Label.TextProperty, textBinding);
            return new ViewCell
            {
                View = label
            };
        });

        DisplayTemplate = displayTemplate;
    }
}

我在绑定中被挂起,因为我不确定如何在代码中执行相当于{Binding Source}的操作。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

@Eugene - 感谢您的回复。不幸的是,这不起作用并且绑定到&#34; Source&#34;像那样抛出一个空参考例外。今天早上我再次通过它并以此方式工作:

public MyColumn()
{
    DataTemplate displayTemplate = new DataTemplate(() =>
    {
        Grid grid = new Grid();
        grid.SetBinding(Grid.BindingContextProperty, "Source");

        Label label = new Label();
        label.SetBinding(Label.TextProperty,FieldName);

        grid.Children.Add(label);

        return grid;
    });

    this.DisplayTemplate = displayTemplate;
}

答案 1 :(得分:0)

很简单,使用属性名称

label.SetBinding(BindingContextProperty, "Source");