2016-03-22 18 views
0

Ich versuche, die Eigenschaft von TextBlock sowohl von CodeBehind (Xaml.cs) und ViewModel Bindung.TextBlock.Text Update ViewModel und CodeBehind WPF

Standardmäßig werden die Werte aus ViewModel geladen, was gut funktioniert.

XAML:

<TextBlock Name="test"> 
    <TextBlock.Text> 
     <MultiBinding StringFormat=" ({0}, {1} of {2})"> 
      <Binding Path="SeriesId" /> 
      <Binding Path="SeriesName" /> 
      <Binding Path="SeriesCalc" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

XAML.cs

In einem Button-Klick-Ereignis die folgende versucht,

test.DataContext = "Not Available"; 

Oder

test.Text = "Not Available"; 

Ansichtsmodell:

In einer anderen Taste Command ich versuche, den Wert auf die TextBlock zuzuweisen.

SeriesId= GetIds(); 
    SeriesName= GetNamesWithDE(); 
    SeriesCalc= CalculateValue(); 

Aber sobald die „Not Available“ von Code hinter eingestellt ist, ist es nicht von ViewModel überschrieben werden könnte.

Wo liege ich falsch?

+1

Sie liegen nicht falsch. aber wenn du den Datenkontext von deinem Viewmodel wegstellst - du kannst den Textblock nicht mehr aktualisieren ... warum in aller Welt willst du das tun ?? – blindmeis

+1

In XAML legen Sie eine Bindung zu Ihrer 'Text' -Eigenschaft fest. Im Code dahinter setzen Sie die Eigenschaft 'Text' zurück. Daher wird deine Bindung poof. – zahir

+0

@zahir: Danke. – iamCR

Antwort

2

Wenn Sie test.Text = "Not Available"; schreiben, haben Sie die Datenbindung durch Überschreiben mit einer einfachen Zeichenfolge abgebrochen. Wenn Sie abschließen möchten, verwenden Sie die Datenbindung und TextBlock Wert aus dem Code hinter ändern und Sie sollten danach Bindung aktualisieren:

test.Text = "Not available"; 
test.GetBindingExpression(TextBlock.TextProperty).UpdateSource(); 

oder mit SetCurrentValue Methode, die den Wert einer Abhängigkeitseigenschaft setzt, ohne Änderung seiner Wertquelle.

test.SetCurrentValue(TextBlock.TextProperty, "Not available"); 
+0

Für das erste Ergebnis erhalte ich 'Objektreferenz' Fehler (' '' '' '' '''' ''findet sich im' test.GetBindingExpression (TextBlock.TextProperty) ') und für das 2. Ergebnis ändert sich der Text für den zweiten Klick der Schaltfläche und bleibt gleich erster Klick, was bedeutet, dass es nach 2 Klicks funktioniert. – iamCR

+0

Da es ein MultiBinding ist, sollte es so etwas wie 'BindingOperations.GetMultiBinding (test, TextBlock.TextProperty);'. Können Sie diesen Code bitte verfeinern und aktualisieren? – iamCR

Verwandte Themen