2015-04-15 10 views
7

Piszę aplikację Xamarin i znalazłem różnicę między WPF, których nie mogę przekroczyć.Przycisk wiązania formularzy Xamarin Command to parent BindingContext

Używam Xamarin Forms Labs, aby uzyskać kontrolę nad Repeater.

Mam Repeater, który powtarza DataTemplate:

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

Ale chciałbym przenieść wykonanie polecenia do mojego UserControl Binding kontekście.

Zwykle z WPF to będzie wyglądać:

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

Ale to nie ma właściwość ElementName.

Odkryłem, że mogę ustawić BindingContext moim przycisku tak:

BindingContext="{x:Reference myUserControl}" 

Ale wtedy nie można powiązać właściwość Text do tekstu mego przycisku.

Jak powinienem to zrobić?

+0

Znalazłeś rozwiązanie tego? Wygląda na to, że 'Source' nie działa z DataTemplate. To też jest prawdziwy wstyd, utrudnia wykonanie prawdziwej MVVM. – MrZander

+0

Nieważne. Byłem w tyle w sprawie aktualizacji. To wydaje się teraz działać. – MrZander

Odpowiedz

11

Można użyć właściwości Source, aby określić źródło powiązania, które będzie używane zamiast bieżącego BindingContext. Następnie tekst może pochodzić z kontekstu powiązania strony i polecenia z innego miejsca.

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

lub

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

lub

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

Oto pełna przykładów. Powszechnym problemem jest niedokonywanie INotifyPropertyChanged i ustawianie właściwości po wywołaniu na 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> 

kod za

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

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

Mam 'ContentPage' z x: Name' wireframe'. W ViewModel tej strony mam właściwość 'MainText'. Następnie w DataTemplate Mam Wytwórnia: '' I to nie działa. Próbowałem również 'Path = BindingContext.MainText'. Brak powodzenia – Tomasz

+0

Czy nieruchomość jest publiczna? – Krumelur

+1

oczywiście jest publiczny – Tomasz

Powiązane problemy