WPF-TextBlock-Bindung an DependencyProperty
Habe ich, was ich glaube zu sein, über eines der am meisten einfachen Fällen der Versuch, binden, Blick auf eine dependencyproperty in der Ansicht Modell. Es scheint, dass die ursprünglichen änderungen in der Sicht, aber andere änderungen an der DP nicht aktualisieren Sie die Ansicht TextBlock. Ich bin wahrscheinlich einfach nur etwas fehlt einfach, aber ich kann einfach nicht sehen, was es ist. Bitte werfen Sie einen Blick...
Mein XAML verfügt über eine Statusleiste am unteren Rand des Fensters. Ich möchte zu binden, um die DP "VRAStatus".
<StatusBar x:Name="sbar" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2"
VerticalAlignment="Bottom" Background="LightBlue" Opacity="0.4" DockPanel.Dock="Bottom" >
<StatusBarItem>
<TextBlock x:Name="statusBar" Text="{Binding VRAStatus}" />
</StatusBarItem>
<StatusBarItem>
<Separator Style="{StaticResource StatusBarSeparatorStyle}"/>
</StatusBarItem>
</StatusBar>
Mein viewmodel hat die DP definiert:
public string VRAStatus
{
get { return (string)GetValue(VRAStatusProperty); }
set { SetValue(VRAStatusProperty, value); }
}
//Using a DependencyProperty as the backing store for VRAStatus.
public static readonly DependencyProperty VRAStatusProperty =
DependencyProperty.Register("VRAStatus", typeof(string), typeof(PenskeRouteAssistViewModel),new PropertyMetadata(string.Empty));
Dann, in meinem code habe ich den DP:
VRAStatus = "Test Message...";
Ist es etwas offensichtlich, dass ich hier vermisst werde? In meinem Konstruktor für die viewmodel ich die DP so:
VRAStatus = "Ready";
Bekomme ich nie die Test-Nachricht angezeigt werden.
InformationsquelleAutor Bill Campbell | 2009-06-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie hinzufügen DataContext="{Binding RelativeSource={RelativeSource Self}}.
InformationsquelleAutor Min Xu
Wie es sich herausstellte, waren die Dinge ein wenig komplizierter, als ich gedacht hatte (wie, wenn das NICHT der Fall 🙂 Mein RibbonControl war in ein Benutzersteuerelement, um alle, die XAML aus dem Hauptfenster. Es war die Tatsache, dass es in einem UserControl, das es anders funktioniert, mit dem ViewModel. Ich weiß nicht, warum - wahrscheinlich eines jener Geheimnisse, das nie gelöst werden. Aber indem mein RibbonControl direkt auf dem Hauptfenster, funktioniert alles wie erwartet - sowohl mit einem DP-und eine C# - Eigenschaft. Interessant. (Wünschte, ich könnte wieder diese zwei Tage in meinem Leben!)
Dank,
Bill
InformationsquelleAutor Bill Campbell
Versuchen Sie, den Namen der DP mit dem Pfad-flag in der Bindung wie diese:
Oh - und der DataContext ist richtig eingestellt auf das viewmodel.
Ja, ich war mir nicht sicher, ob es würde einen Unterschied machen, als ich bin nur zu lernen, WPF mich. Scheint seltsam, dass Sie in der Lage sind, um Zugriff auf den neuen Wert obwohl. Haben Sie versucht, die Angabe des binding-Modus TwoWay? So etwas wie {Binding Path=VRAStatus, Mode=TwoWay}
Nochmals Vielen Dank! Ich glaube, dass die zwei-Wege-Bindung ist die Standardeinstellung. Ich versuchte es jedenfalls keine Veränderung. Ich muss fehlt etwas wirklich dumm.
Hmm, hat Ihr PenskeRouteAssistViewModel von DependencyObject Erben? Es scheint, dass die textbox nicht informiert, die Eigenschaft ändern, da es aussieht wie die Bindung richtig eingestellt.
InformationsquelleAutor stevosaurus
Bill,
Wann und wo stellst du den DataContext? Ich hatte Probleme in der Vergangenheit, dass, wenn ich den DataContext vor dem InitializeComponent, meine Bindungen nie richtig durchgeführt.
Außerdem für Neugier halber: warum verwenden Sie einen DP in der ViewModel, anstatt nur eine Eigenschaft?
Sie sind sich auch ziemlich sicher, dass der DataContext nicht woanders auch?
Und Sie DataContext auf das ViewModel statt zu der Ansicht? I. e: dies.DataContext = myViewModel; Statt:.DataContext = this;
ja - hier ist meine app.xaml.cs: // Erstellen Sie das ViewModel, welches das Hauptfenster bindet var ViewModel = new ViewModel(dockManager); //Zeige das Hauptfenster PRA vRAWindow = new PRA(ViewModel); und die Ansicht Konstruktor: public PRA(ViewModel-vm) { viewModel = vm; DataContext = vm; InitializeComponent(); } Wir haben wirklich vorsichtig sein, nicht zu DataContext in anderen Orten. Bitte lassen Sie mich wissen, wenn Sie denken an nichts anderes und vielen Dank für die Zeit nehmen, mit einer guten Antwort!
Sorry für die Beförderung Kontrollen kommen nicht durch in meiner letzten Antwort - macht es ziemlich schwer zu Lesen.
InformationsquelleAutor user112889
Versuchen, geben Sie die UpdateSourceTrigger-Eigenschaft der Bindung:
InformationsquelleAutor juanjo.arana