2016-03-05 3 views
1

Я расширяю элемент управления, чтобы иметь возможность повторно использовать его в моем текущем проекте Xamarin. Как часть этого элемента управления, мне нужно создать DataTemplate программно. Я выяснил, что эта часть работает нормально.Как сделать эквивалент {Binding Source} в коде?

В DataTemplate есть надпись. Мне нужно привязать свойство BindingContext Label к {Binding Source}. Мне нужно привязать свойство Text Label к {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} в код. Любая помощь будет оценена по достоинству.

ответ

1

@Eugene - Спасибо за ответ. К сожалению, это не работает, и привязка к «Источнику», как это, делает исключение Null Reference Exception. Я сделал еще один проход на него этим утром и получил это работает так:

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

Это просто, используйте имя собственности

label.SetBinding(BindingContextProperty, "Source"); 
+0

В случае, если кто задается вопросом, почему этот простой ответ не работает, Юджин комментарии, после просмотра, как OP получил его на работу позже, в [ эквивалентный Xamarin Forums thread] (https://forums.xamarin.com/discussion/62189/how-to-do-the-equivalent-of-binding-source-in-code), который он пропустил, что это находится в DataTemplate. – ToolmakerSteve