2013-03-25 1 views
11

I zu binden eine Reihe von Textfeldern in einem Raster in Eigenschaften eines Objekts, das in meinem Ansichtsmodell einer andere Eigenschaft selbst will (die Datacontext).Bindung an eine Eigenschaft eines Objekts

CurrentPerson besteht aus Name und Age Eigenschaften

Im Inneren des Ansichtsmodell:

public Person CurrentPerson { get; set ... (with OnPropertyChanged)} 

XAML:

<TextBox Text="{Binding Name}" > 
<TextBox Text="{Binding Age}" > 

ich auf dem Ansatz nicht sicher war, zu verwenden, habe ich ein weiterer DataContext im Grid-Bereich, ohne Ergebnis, auch versucht s die Quelle und den Pfad wie Source = CurrentPerson, Path = Age erneut ohne Ergebnis zu setzen, diese waren für einen Versuch und sehen, ob es eine Änderung geben würde oder nicht.

Wie soll ich das erreichen?

Antwort

17

Haben Ihre Person Klassenmitglieder Name und Age INPC selbst erhöhen?

Wenn Sie den Wert von entweder Name oder Age im ViewModel und haben es in der Ansicht reflektieren aktualisieren möchten, müssen Sie diese Eigenschaft erhöhen sowohl einzeln als auch im Inneren Person Klasse geändert.

Die Bindungen sind in Ordnung, aber die Ansicht wird von Änderungen aus dem Ansichtsmodell ziemlich nicht benachrichtigt. Beachten Sie auch UpdateSourceTrigger für eine TextBox ist standardmäßig LostFocus, Einstellung auf PropertyChanged wird Ihre Zeichenfolge in der ViewModel als Ihre Eingabe aktualisieren.

Einfaches Beispiel:

public class Person : INotifyPropertyChanged { 
    private string _name; 
    public string Name { 
    get { 
     return _name; 
    } 

    set { 
     if (value == _name) 
     return; 

     _name = value; 
     OnPropertyChanged(() => Name); 
    } 
    } 

    // Similarly for Age ... 
} 

Jetzt würde XAML sein:

<StackPanel DataContext="{Binding CurrentPerson}"> 
    <TextBox Text="{Binding Name}" /> 
    <TextBox Margin="15" 
      Text="{Binding Age}" /> 
</StackPanel> 

oder Sie können auch wie vorgeschlagen binden, indem @Kshitij

<StackPanel> 
    <TextBox Text="{Binding CurrentPerson.Name}" /> 
    <TextBox Margin="15" 
      Text="{Binding CurrentPerson.Age}" /> 
</StackPanel> 

und View-Modell zu aktualisieren Ihre Eingabe

<StackPanel DataContext="{Binding CurrentPerson}"> 
    <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> 
    <TextBox Margin="15" 
      Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}" /> 
</StackPanel> 
+0

Bekam den Punkt, danke – LastBye

12

Versuchen Sie folgendes:

<TextBox Text="{Binding CurrentPerson.Name}" /> 
<TextBox Text="{Binding CurrentPerson.Age}" /> 

Im Wesentlichen Sie können mithilfe des . Separator in Eigenschaften Drilldown.

Für die Zukunft, wenn Sie in Sammlungen aufschlüsseln möchten, können Sie MyCollection[x] verwenden so wie Sie es in Code (wobei x durch eine hartcodierte Zahl ersetzt werden würde, keine Variable).

+0

+1 und danke für die Info, waren nicht sicher, dass ich im Xaml Teil kann ich das verwenden, aber ich denke, ich habe es auch so versucht.Erneut hat dieser Ansatz ohne Ergebnis, CurrentPerson definiert und NotifyPropertyChanged ausgelöst, aber vielleicht fehlt etwas. – LastBye

+0

Scheint, dass die Benachrichtigungsänderung auf diese Weise nicht aktiv wird. Ist es wahr ? Wie soll ich das beheben? – LastBye

+0

Hat bei mir noch nicht funktioniert. Ich weiß nicht warum ... – LastBye