WPF Binding eine Abhängigkeitseigenschaft
Ich habe ein Problem-Bindung eine Abhängigkeit Eigenschaft in einem UserControl. Wenn es initialisiert wird, bekommt es einen Wert, aber dann wird es nicht aktualisiert. Ich habe wahrscheinlich etwas verpasst offensichtliche, hier sind einige code-snippets:
Dies ist, wo ich bind die BalanceContent
Abhängigkeitseigenschaft:
<Game:PlayerDetails x:Name="SelectedPlayerDetails" Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2" Grid.RowSpan="4"
BalanceContent="{Binding Source={StaticResource UserData}, Path=SelectedUser.Balance, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
</Game:PlayerDetails>
Hier ist die TextBox
im UserControl
:
<TextBox VerticalAlignment="Center" FontFamily="Formata" FontSize="20" Grid.Column="2"
Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}}, Path=BalanceContent}"
Grid.Row="7"></TextBox>
Hier ist die Abhängigkeit Eigenschaft:
public static readonly DependencyProperty BalanceContentProperty = DependencyProperty.Register(
"BalanceContent", typeof(string), typeof(PlayerDetails));
public string BalanceContent
{
get
{return (string) GetValue(BalanceContentProperty);}
set
{SetValue(BalanceContentProperty, value);}
}
Hier ist die Liste, in dem der ausgewählte Benutzer wird aktualisiert, die in einer Ansicht verwendet, die das Benutzersteuerelement:
<ListView x:Name="lstAccounts" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Grid.RowSpan="4"
ItemsSource="{Binding Source={StaticResource UserData}, Path=CurrentUserSearch}"
SelectedItem="{Binding Source={StaticResource UserData}, Path=SelectedUser}"
Sowie SelectedUser
definiert ist hier in einer Klasse, die INotifyPropertyChanged
:
public User SelectedUser
{
get
{
return _selectedUser;
}
set
{
_selectedUser = value;
OnPropertyChanged(new PropertyChangedEventArgs("SelectedUser"));
}
}
Die Idee ist, dass die TextBox aktualisieren sollten, wenn Sie einen neuen Benutzer in der Liste ausgewählt ist, aber im moment ist es nicht so. Ich habe die Bindung auf dem lokalen TextBox und schreibt es in Ordnung, nur nicht auf eine DependencyProperty
. Jede Hilfe zu schätzen.
InformationsquelleAutor paj7777 | 2012-11-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einige Möglichkeiten, die Sie könnten versuchen:
Zuerst, Ihre ListView-Steuerelement kann nicht aktualisiert werden Ihrig ViewModel SelectedUser Eigenschaft. Versuchen Sie, die Einstellung der Bindung in Ihre ListView auf "TwoWay" - Modus:
Können Sie organisieren Sie besser, den Weg der DataContext ist, definiert werden. Denken Sie daran, dass alle untergeordneten Steuerelemente von Ihrem UserControl haben Zugang zu Ihren DataContext ohne die Nutzung von relative Bindung (Erben). Wie Ihr PlayerInfo control ist abhängig von der SelectedUser, erwägen Sie, es ist DataContext der SelectedUser, entweder Bindung an die SelectedUser der ListView, oder die SelectedUser in der UserData viewmodel.
Die Quelle des aktuellen SelectedUser könnte auch das ListView:
So oder so, Sie können dann gehen Sie auf die TextBox, da seine DataContext wird der gleiche sein wie der, der von seinen Eltern:
Wenn das Benutzersteuerelement, hängt von der root-viewmodel für Dinge wie Befehle und andere high-level-Logik, dann DataContext, um es in einer Weise, die Sie leicht zugreifen können, die SelectedUser.
Damit Sie dies tun können:
In diesem zweiten Ansatz, jedoch, Sie haben zu prüfen, eine Sache, die ich bin mir nicht sicher. Ich weiß, dass, wenn der DataContext eines Steuerelements ändert, erfolgt die Aktualisierung aller abhängigen Bindungen in Ordnung. Zum Beispiel, wenn Sie die DataContext-PlayerDetails zu einer anderen UserData-Instanz, die BalanceContent-Eigenschaft zu aktualisieren, wie gut. In diesem Fall ist aber die BalanceContent hängt von der Eigenschaft des SelectedUser der UserData. So wird es hören-Eigenschaft ändert, der die Instanz des Nutzers. Wenn die SelectedUser.Balance-änderungen (und Benutzer INotifyPropertyChanged implementiert, oder es ist ein DependencyProperty), BalanceContent aktualisiert. Nun, wenn die SelectedUser Instanz in der UserData Veränderungen, ich bin mir nicht sicher, BalanceContent aktualisieren, weil ich denke, dass eine verbindliche hört nicht auf änderungen von jedem Objekt in seinem Pfad.
BEARBEITEN
Der Letzte Punkt war vielleicht das erste problem, das ich treffen, wenn die Entwicklung mit xaml. Ich hatte ein DataGrid in Silverlight, deren entity-Typ hatte eine Eigenschaft eines komplexen Typs. Eine der Säulen hing auf eine Eigenschaft des komplexen Typs. Wenn ich änderte den Wert des komplexen Typs, wird die Spalte aktualisiert werden würde, fein (es umgesetzt INPC). Wenn ich änderte den komplexen Typ Instanz einer Entität, die Spalte würde nicht... Die Lösung war, cascade DataContexts: ich habe eine Vorlage erstellt, die Spalte, legen Sie die Bindung der Spalte, für die ein komplexer Typ, anstatt deren Eigentum. Dann bin ich gebunden den text der TextBox mein template um die Eigenschaft des complextype, da war es nun das Textfeld des DataContext.
In Ihrem Fall können Sie es tun für die TextBox.Text, aber nicht für den PlayerDetails.BalanceContent. Sie können binden Sie das Textfeld.DataContext der SelectedUser der UserData und dann binden Sie Text, um die Balance-Eigenschaft.
So ändern Sie die Quelle des SelectedUser der ListView gearbeitet, obwohl XAML beschwert sich über nicht in der Lage, zu beheben, das Gleichgewicht, ich denke mal, dass zur design-Zeit, die es offensichtlich tun.
InformationsquelleAutor Arthur Nunes
Bitte testen Sie nach dem ändern Ihrer binding für Textfeld in Ihrem Benutzer-Steuerelement zu binden, BalanceContent die Benutzer-Steuerelemente Abhängigkeitseigenschaft (Ihre ursprüngliche verbindliche Quelle zu sein scheint, data context-Eigenschaft)
EDIT: Bitte versuchen Sie den folgenden code
Ich habe bearbeitet meine codiert, um Sie entsprechend Ihrem Vorschlag, wenigstens die Quelle ist mehr offensichtlich. Aber es funktioniert immer noch wie vorher, wo der Wert ist, aktualisieren Sie auf initialisieren, aber nicht, wenn sich der Wert ändert.
Ja, der Grund für die Aktualisierung bindend war, dass die ursprüngliche Bindung Quelle gebunden war an eine Eigenschaft DataContext aber es schien wie es ist eine Abhängigkeit der Eigenschaft des benutzerdefinierten Steuerelements. Könnten Sie bitte per post Ihre Abhängigkeit von den Eigenschaft code?
Könnte Sie erstellen Sie bitte eine andere Eigenschaft auf der ViewModel, nennen wir es SelectedUserBalance und verwenden Sie diese Eigenschaft als eine Quelle für BalanceContent-Eigenschaft des Steuerelements? Auch update SelectedUser zu gehören OnPropertyChanged(new PropertyChangedEventArgs("SelectedUserBalance")); jedes mal, wenn er gesetzt ist.
Ok, ich habe den code für die Abhängigkeitseigenschaft. Hinzufügen SelectedUserBalance Eigenschaft hat nicht funktioniert.
InformationsquelleAutor byte
Textbox versucht zu binden, um die Benutzersteuerelemente
DataContext
. geben Sie einx:Name
dem Usercontrol-definition und legen Sie das Textfeld des DataContext zuDataContext="{Binding ElementName=[YourControlName]}"
InformationsquelleAutor Federico Berasategui
vergessen, die die Bindung des UserControl , Direkt binden TextBox zu SelectedItem . Ich hoffe, das wird helfen.
InformationsquelleAutor ethicallogics
Bindung eine StaticResource um die Immobilie. StaticResources, im Gegensatz zu DynamicResources, werden nur einmal geladen, wenn das Fenster (oder UserControl) wird initialisiert. DynamicResources werden nur bei Bedarf geladen (und jedes mal, wenn erforderlich). Jede änderung, die gemacht wird, um eine DynamicResource abgeholt wird, sofort, und die Eigenschaft wird entsprechend aktualisiert. Ersetzen Sie einfach das Stichwort "StaticResource" mit "DynamicResource", und die Eigenschaft Bindung sollte aktualisieren, jedes mal, wenn die Ressource ändert.
Hinweis: Wenn die StaticResource-ist ein Objekt, ergibt sich aus der Freezable-Klasse, wird es Verhalten sich auch so etwas wie ein DynamicResource. Zum Beispiel, wenn Sie Ihre Ressource ist eine Bürste, die gebundene Eigenschaft wird aktualisiert, jedes mal, wenn Sie ändern Sie die Pinsel-Objekt in irgendeiner Weise (durch ändern der Deckkraft, zum Beispiel), aber dies ist aufgrund des Verhaltens vererbt von der Freezable-Klasse. Allerdings, wenn Sie die Bürste ersetzen, Objekt in der StaticResource-durch ein neues Brush-Objekt diese ändern Sie nicht abgeholt werden, weil die änderung wurde gemacht, um die Ressource, die Statisch, nicht den Pinsel.
Beachten Sie auch: Selbst Ressourcen, die es nur als StaticResources, wie Daten SystemColors, SystemFonts (die Zugriff auf system-Einstellungen) gewickelt werden kann in einer DynamicResource, um sicherzustellen, dass die Eigenschaft wird aktualisiert bei jeder änderung. Diese kann getan werden, auf diese Weise:
<Control Property="{DynamicResource {x:Static SystemColors.XXX}}"></Control>
.InformationsquelleAutor muneebshere