2015-04-15 5 views
7

Я пишу приложение Xamarin, и я нашел разницу между WPF, который я не могу пересечь.Кнопка привязки формы Xamarin к родительскому BindingContext

Я использую лаборатории Xamarin Forms для получения контроля ретранслятора.

У меня есть Repeater, который повторяет DataTemplate:

<DataTemplate> 
    <Button Text="{Binding Text}" Command="{Binding CategorySelectedCommand}" /> 
</DataTemplate> 

Но я хотел бы, чтобы переместить выполнение команды в моей UserControl Binding контексте.

Обычно с WPF это будет выглядеть так:

Command={Binding ElementName=myUserControl, Path=DataContext.CategorySelectedCommand} 

Но это не имеет ElementName свойство.

Я обнаружил, что я мог бы установить BindingContext моей кнопки, как это:

BindingContext="{x:Reference myUserControl}" 

Но тогда я не могу связать свойство текста к тексту моей кнопки.

Как мне это сделать?

+0

Вы нашли решение этой проблемы? Кажется, что 'Source' не работает с DataTemplate. Это настоящий позор, затрудняет реальный MVVM. – MrZander

+0

Nevermind. Я был в курсе обновлений. Кажется, это работает сейчас. – MrZander

ответ

11

Свойство Source можно указать, чтобы указать источник привязки, который будет использоваться вместо текущего BindingContext. Затем текст может исходить из контекста привязки страницы и команды из другого места.

Command="{Binding CategorySelectedCommand, Source={x:Static me:SomeStaticClass.YourUserControl}}" 

или

Command="{Binding CategorySelectedCommand, Source={DynamicResource yourUserControlKey}}" 

или

Command="{Binding CategorySelectedCommand, Source={x:Reference myUserControl}}" 

Вот полный пример. Общая проблема заключается в том, чтобы не реализовать INotifyPropertyChanged и установить свойство после позвонить по телефону InitializeComponent().

XAML

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="test.MyPage" x:Name="ThePage"> 
    <Label Text="{Binding TextProp, Source={x:Reference ThePage}" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" /> 
</ContentPage> 

код за

public partial class MyPage : ContentPage 
{ 
    public MyPage() 
    { 
     this.TextProp = "Some Text"; 
     InitializeComponent(); 
    } 

    public string TextProp 
    { 
     get; 
     set; 
    } 
} 
+0

У меня есть «ContentPage» с x: Name «wireframe». В ViewModel этой страницы у меня есть свойство 'MainText'. Тогда в DataTemplate У меня есть ярлык: '<Метка Текст = "{Binding Source = {х: Ссылка каркасный}, Path = MainText}">' И это не работает. Я также попробовал «Path = BindingContext.MainText'. Нет успехов – Tomasz

+0

Общедоступна ли собственность? – Krumelur

+1

, конечно, это общедоступно – Tomasz

Смежные вопросы