2015-05-20 14 views
7

Wie MSDN sagen:Warum hat diese Typbindung merkwürdiges Verhalten?

Gegebenenfalls kann ein Zeitraum Pfad zum aktuellen Quelle binden genutzt werden kann (.). Zum Beispiel entspricht Text = "{Binding}" Text = "{Binding Path =.}".

Aber in zwei Beispielen unten i mit unterschiedlichem Verhalten konfrontiert:

Erstens:

<StackPanel> 
    <TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/> 
    <Grid DataContext="{Binding Path=MyString}"> 
     <TextBox Text="{Binding}"></TextBox> 
    </Grid> 
    </StackPanel> 

dieses Beispiel raise Ausnahme mit der Meldung:

„Zwei-Wege-Bindung erfordert Pfad oder XPath. "

Zweitens:

<StackPanel> 
    <TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/> 
    <Grid DataContext="{Binding Path=MyString}"> 
     <TextBox Text="{Binding Path=.}"></TextBox> 
    </Grid> 
    </StackPanel> 

Und dieses Beispiel richtig und erste TextBox Textänderung laufen reflektierte Ansichtsmodell und den Text der ersten TextBox geändert zu, aber wenn die zweite TextBox Text geändert, dass nicht zu Ansichtsmodell reflektiert (oder ersten Textfeld)!

Frage: Ich schätze jemand erklären dieses zwei Szenario?

Hinweis: Datacontext der Elternkontrolle (wie Fenster) ist eine einfache Klasse mit einer Eigenschaft pflichtige MyString:

Dank.

+1

* in der Datacontext die String-Instanz von dem Text ersetzt den Text in der zweiten TextBox * bearbeiten. Es aktualisiert keine Eigenschaft. – Clemens

+0

@Clemens, "die String-Instanz im DataContext" ist MyString, warum also nicht aktualisiert? –

+0

Für den Binding-Fehler in einem Fall, aber nicht der andere: die Text-Eigenschaft bindet standardmäßig bidirektional, und offensichtlich überprüft die Binding-Klasse, ob die Path-Eigenschaft festgelegt ist, wenn es zweiseitig ist. Es scheint jedoch, dass es nicht überprüft, ob Path eine Eigenschaft oder nur das Quellobjekt selbst bezeichnet. – Clemens

Antwort

0

scheint immer, wenn es eine Zwei-Wege-Bindung gibt {Binding Path =.} Ist erforderlich. Versuchen Sie, den Code wie folgt zu ändern:

<StackPanel> 
      <TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/> 
      <Grid DataContext="{Binding Path=MyString}"> 
       <!--<TextBox Text="{Binding}"></TextBox>--> 
       <Label Content="{Binding}"/> 
      </Grid> 
     </StackPanel> 

und es funktioniert gut. Auf dem ursprünglichen Code funktioniert auch die Bindung.

hier ist ein relatives Thema:

Are "{Binding Path=.}" and "{Binding}" really equal

Verwandte Themen