Immer Wert von ViewModel durch DataContext OHNE Bindung?
Neu in WPF. Ich Schaffe Benutzersteuerelemente, müssen Sie Lesezugriff auf die ViewModel-Zustand, Ihr Ding zu machen. Derzeit nutze ich folgende Technik:
public partial class ControlBar : UserControl
{
private static readonly DependencyProperty URLProperty =
DependencyProperty.Register("URL", typeof(string), typeof(ControlBar),
new UIPropertyMetadata(null));
public ControlBar()
{
InitializeComponent();
SetBinding(URLProperty, "CurrentPage.URL");
Pin.Click += Pin_Click;
}
private void Pin_Click(object sender, RoutedEventArgs e)
{
var URL = (string)GetValue(URLProperty);
}
}
Ist dies der richtige Weg und ist es nicht übertrieben zu einrichten, eine langfristige Bindung für jede variable, die ich brauchen Zugang zu? Oder können Sie etwas tun:
GetValue(new Path("CurrentPage.URL.....
Ich habe die oben natürlich.
Dank!
- Warum nicht geben Sie die Bindungen in XAML? Sie würde die Notwendigkeit zur Umsetzung der DP vollständig funktionieren kann (getter/setter)
- Ich könnte das set-up die Bindung im XAML-Code. Es ist nicht das set-up, das mich betrifft. Es ist die Notwendigkeit für 'Platzhalter' DependencyProperties in jedem Benutzer die Kontrolle, für den alleinigen Zweck der Zugriff auf das viewmodel. Diese DPs sind privat, so haben Sie keine andere Verwendung.
- Ich würde vorschlagen, dass, wenn Sie schreiben ein benutzerdefiniertes Steuerelement, das sich auf view-model-Eigenschaften, diese sollen ausgesetzt werden, als öffentlich einstellbaren Eigenschaften für das Steuerelement
- Warum? Wenn es ein Stück von Informationen, dass 29 Personen zugreifen müssen, um Ihre Arbeit zu tun, deshalb würden alle 29 Personen aussetzen, die gleichen Informationen öffentlich. z.B. ein flag für "Benutzer ist angemeldet?" Scheint, wie Umweltverschmutzung. Es sollte ausgesetzt werden, durch eine einzelne Person... Die 29 sollten nur dann aussetzen, Dinge, die ein Elternteil angepasst werden können, Ihrem individuellen Verhalten.
- Ohne zu wissen, mehr über die Besonderheiten kann ich nicht wirklich kommentieren, aber wenn Sie schreiben ein Steuerelement, das ändert sein Verhalten, basierend auf einem Wert, dann denke ich nicht, dass es unvernünftig ist für die Steuerung zu setzen, dass Wert.
- Naja auf jeden Fall... Es gibt keinen anderen Weg, um die Daten aus dem viewmodel ich fange an zu sammeln. Ich brauche einen DP + Bindung?
- Sie könnten versuchen, ein paar andere Dinge, aber ich habe nicht versucht, Sie selbst. Eine wäre, zu reagieren, um die Steuerelemente
DataContext
Eigenschaft geändert wurde (diese wird auf die view-Modell-Instanz). Anderen möglicherweise die Verwendung einer einzelnen Eigenschaft auf den Wert des view-Modell-in seiner Gesamtheit und verwenden Sie dann den Wert zu ziehen aus alle Eigenschaften, die Sie brauchen - es ist noch einige binden, aber nicht eine für jeden Wert. - Danke. Ich gebe diesen einen Versuch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen Daten-Bindung ist der Weg zu gehen. Aber manchmal, wenn Sie erstellen von Steuerelementen, die über die view-spezifischen Anliegen, für die Daten-Bindung wird nicht angemessen sein.
In diesen Fällen werden Sie in der Lage sein, um die Interaktion mit der DependencyProperty zu setzen und wissen, wenn es änderungen. Ich habe nach einem Muster, dass ich abgeholt, von Charles Petzold-Artikel im MSDN Magazin.
Meine Antwort zu einer anderen Frage zeigt das Muster für die Erstellung einer DependencyProperty für ein UserControl - Stack-Überlauf: Abhängigkeitseigenschaft In WPF/SilverLight
Wieder, Datenbindung, um ein view-model wird wahrscheinlich Ihr problem zu lösen, aber eine DependencyProperty kann nützlich sein, je nach situation.
Update in Reaktion auf Kommentar:
In vielen Situationen können Sie die Daten binden Sie in ein Benutzersteuerelement ohne Verwendung einer DependencyProperty. Wenn Sie zum Beispiel einen TextBlock, der zeigt, dass ein name, den Sie setzen würde, die einen TextBlock in der XAML die UserControl -
In die view-Modell-die derzeit in den DataContext würden Sie eine Immobilie haben, NameString, und wenn der TextBlock ist um die Anzeige zu aktualisieren, wenn der NameString-Eigenschaft ändert sich die Ansicht Modell sollte INotifyPropertyChanged implementieren und die Eigenschaft Feuer sollte das PropertyChanged-Ereignis mit dem Namen der Eigenschaft, geschickt zusammen mit dem Ereignis.
Wo Notify ist eine Methode, die überprüft, das PropertyChanged-Ereignis für null und sendet das Ereignis, wenn nicht null.
Dies funktioniert gut, wenn überall, wo Sie möchten, verwenden Sie das UserControl besitzt ein view-Modell mit einer Name-Eigenschaft. Das tolle daran ist, dass das Benutzersteuerelement können abholen auf der DataContext, wo immer es sich befindet, und die binden an eine externe Sicht auf das Modell.
Wenn Sie möchten, starten Sie die Bindung der gleiche UserControl unterschiedlichen Eigenschaften ist ein Ort, den Sie verwenden möchten, können Sie eine DependencyProperty. In diesem Fall könnten Sie ein Benutzersteuerelement mit einem DependencyProperty und binden Sie es auf verschiedene Eigenschaften
Haben und dann ein internes view-Modell, die das DependencyProperty-change-Prozedur aktualisiert, wenn die gebundene Eigenschaft ändert.
Update: Keine DependencyProperty oder verbindlich
Können Sie immer noch eine normale C# - Eigenschaft für das UserControl und übergeben Sie die Daten auf diese Weise.
Dann in der CodeBehind des UserControl können Sie einfach die Eigenschaft:
Update in Reaktion auf Kommentar:
Anderen Weg, um den Zugriff auf die view-Modell-in-code zu werfen, den DataContext auf die Ansicht Modell-Typ: