2015-04-15 6 views
7

Ich schreibe Xamarin Anwendung und ich fand Unterschiede zwischen WPF, die ich nicht überschreiten kann.Xamarin Forms binding button Befehl zum übergeordneten BindingContext

Ich verwende Xamarin Forms Labs, um Repeater-Kontrolle zu erhalten.

Ich habe einen Repeater, die Datatemplate wiederholt:

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

Aber ich mag die Befehlsausführung zu meinem Usercontrol Bindungskontext bewegen.

mit WPF Normalerweise würde es wie folgt aussehen:

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

Aber es hat nicht Elementname-Eigenschaft.

Ich habe festgestellt, dass ich Binding meiner Taste wie folgt einstellen könnte:

BindingContext="{x:Reference myUserControl}" 

Aber dann kann ich nicht Text-Eigenschaft auf meine Schaltfläche Text binden.

Wie soll ich das tun?

+0

Haben auch Sie eine Lösung für dieses? Es scheint, dass 'Source' nicht mit einem DataTemplate funktioniert. Es ist auch eine Schande, macht es schwierig, echte MVVM zu tun. – MrZander

+0

Vergesst nicht. Ich war auf Updates. Dies scheint jetzt zu funktionieren. – MrZander

Antwort

11

Sie können die Source-Eigenschaft verwenden, um eine Quelle für die Bindung anzugeben, die anstelle der aktuellen BindingContext verwendet wird. Dann kann der Text aus dem Bindungskontext der Seite und dem Befehl von woanders kommen.

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

oder

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

oder

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

Hier ist ein vollständiges Beispiel. Ein häufiges Problem besteht darin, INotifyPropertyChanged nicht zu implementieren und die Eigenschaft nach den Aufruf an InitializeComponent() festzulegen.

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> 

-Code hinter

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

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

Ich habe eine 'ContentPage' mit x: Name' wireframe'. In ViewModel dieser Seite habe ich die Eigenschaft 'MainText'. Dann in Datatemplate Ich habe Label: '' Und es funktioniert nicht. Ich habe auch 'Path = BindingContext.MainText' versucht. Kein Erfolg – Tomasz

+0

Ist die Immobilie öffentlich? – Krumelur

+1

natürlich ist es öffentlich – Tomasz