WPF Liaison d'une Propriété de Dépendance
Je vais avoir un problème de liaison d'une propriété de dépendance dans un UserControl. Lorsqu'il initialise il obtient une valeur, mais il ne sera pas mise à jour. J'ai sans doute raté quelque chose d'évident, voici quelques extraits de code:
C'est là que je la lie de la BalanceContent
propriété de dépendance:
<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>
Ici est la TextBox
dans le 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>
Ici est la Propriété de Dépendance:
public static readonly DependencyProperty BalanceContentProperty = DependencyProperty.Register(
"BalanceContent", typeof(string), typeof(PlayerDetails));
public string BalanceContent
{
get
{return (string) GetValue(BalanceContentProperty);}
set
{SetValue(BalanceContentProperty, value);}
}
Voici la liste où l'utilisateur sélectionné est mis à jour, qui est dans une vue qui utilise le contrôle UserControl:
<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}"
Et SelectedUser
est ici définie dans une classe qui implémente INotifyPropertyChanged
:
public User SelectedUser
{
get
{
return _selectedUser;
}
set
{
_selectedUser = value;
OnPropertyChanged(new PropertyChangedEventArgs("SelectedUser"));
}
}
L'idée est que la zone de texte doit mettre à jour lorsqu'un nouvel utilisateur est sélectionné dans la liste mais pour le moment c'est de ne pas le faire. J'ai mis la liaison locale de la zone de texte et de la mise à jour de l'amende, mais pas sur un DependencyProperty
. Toute aide appréciée.
OriginalL'auteur paj7777 | 2012-11-20
Vous devez vous connecter pour publier un commentaire.
Il y a quelques possibilités que vous pourriez essayer:
Tout d'abord, votre ListView ne peut pas être mise à jour vôtre ViewModel est SelectedUser de la propriété. Essayez de définir la liaison dans votre ListView "Bidirectionnels" mode:
Vous pouvez mieux organiser la façon dont le DataContext sont définis. Rappelez-vous que tous les contrôles enfants de votre UserControl aura accès à son DataContext sans l'utilisation d'un relatif de liaison (ils en hériter). Comme votre PlayerInfo de contrôle dépend de la SelectedUser, le paramètre du DataContext de la SelectedUser, soit le lie à l'SelectedUser de la liste ou de la SelectedUser dans le UserData viewmodel.
La source de courant SelectedUser pourrait aussi être le ListView:
De toute façon, vous serez alors en mesure d'effectuer les opérations suivantes sur la zone de texte, parce que son DataContext sera la même que celle de son parent:
Si le contrôle usercontrol dépend de la racine viewmodel pour des choses comme les commandes et les autres de haut niveau de la logique, puis définissez le DataContext dans une manière que vous pouvez facilement accéder à la SelectedUser.
De sorte que vous pouvez le faire:
Dans cette seconde approche, cependant, vous devrez vérifier une chose que je ne suis pas sûr à ce sujet. Je sais que lorsque le DataContext de contrôle des changements, il mettra à jour tous les dépendants liaisons bon. Par exemple, si vous avez changé le PlayerDetails DataContext à l'autre UserData exemple, la BalanceContent propriété de mise à jour ainsi. Toutefois, dans ce cas, le BalanceContent dépend de la propriété de la SelectedUser de l'Utilisateur. Donc, il sera à l'écoute des modifications des propriétés de l'instance de l'Utilisateur. Si le SelectedUser.La Balance des changements (et l'Utilisateur met en œuvre INotifyPropertyChanged, ou c'est une DependencyProperty), BalanceContent sera mise à jour. Maintenant, si le SelectedUser exemple dans le UserData changements, je ne suis pas sûr BalanceContent de mettre à jour, parce que je pense qu'une liaison n'écoute pas les modifications de chaque objet dans son chemin.
MODIFIER
Le dernier point est peut-être le premier problème que j'ai touché lors du développement avec xaml. J'ai eu un contrôle DataGrid dans Silverlight dont le type d'entité avait une propriété d'un type complexe. L'une des colonnes reposait sur une propriété de type complexe. Si j'ai changé la valeur du type complexe, la colonne de mise à jour de l'amende (mise en œuvre de l'INPC). Si j'ai changé le type complexe instance d'une entité, la colonne ne serait pas... La solution a été de cascade DataContexts: j'ai créé un modèle de colonne, de définir la liaison de la colonne du type complexe, à la place de ses biens. Ensuite, j'ai lié le texte de la zone de texte de mon template pour le bien de la complextype, puisque c'est maintenant la zone de texte du DataContext.
Dans votre cas, vous pouvez le faire pour la zone de texte.Le texte, mais pas pour le PlayerDetails.BalanceContent. Vous pouvez lier la zone de texte.DataContext de la SelectedUser de la UserData et puis de lier le Texte à l'Équilibre de la propriété.
Par conséquent, la modification de la source de la SelectedUser à la liste qui a fonctionné, même si XAML se plaint de ne pas être en mesure de résoudre l'Équilibre, qui, j'imagine, au moment de la conception, il est évident qu'elle va faire.
OriginalL'auteur Arthur Nunes
S'il vous plaît essayer de tests après la modification de votre liaison de zone de texte à l'intérieur de votre contrôle à l'utilisateur de se lier à BalanceContent qui est l'Utilisateur le Contrôle de la Propriété de Dépendance (l'original de votre source de liaison semble être le contexte de données de propriété)
EDIT: s'il vous Plaît essayer le code suivant
J'ai édité mon codé pour tenir compte de votre suggestion, au moins la source est plus évident. Cependant, il fonctionne toujours comme avant, où la valeur est mise à jour sur initialiser mais pas lors de la modification de la valeur.
Oui, la raison de la mise à jour de la liaison a été qu'à l'origine, la source de liaison a été lié à une propriété DataContext mais il semble que c'est une propriété de dépendance de votre contrôle personnalisé. Pourriez-vous svp poster votre Dépendance du code de la Propriété?
Pourriez-vous s'il vous plaît créer une autre propriété sur votre ViewModel, nous allons l'appeler SelectedUserBalance et d'utiliser cette propriété comme une source pour BalanceContent propriété de votre contrôle? Également mettre à jour SelectedUser inclure OnPropertyChanged(nouveau PropertyChangedEventArgs("SelectedUserBalance")); à chaque fois qu'il est fixé.
Ok, j'ai ajouté le code de la propriété de dépendance. L'ajout de SelectedUserBalance propriété n'a pas fonctionné.
OriginalL'auteur byte
La zone de texte est d'essayer de se lier à la UserControls
DataContext
. donner unx:Name
à la définition du contrôle utilisateur et définissez la zone de texte du DataContext deDataContext="{Binding ElementName=[YourControlName]}"
OriginalL'auteur Federico Berasategui
oublier la liaison de UserControl , Directement lier zone de texte à SelectedItem . J'espère que cela aidera.
OriginalL'auteur ethicallogics
Vous liez une StaticResource à la propriété. StaticResources, par opposition à DynamicResources, sont chargés qu'une seule fois, lorsque la Fenêtre (ou UserControl) est en cours d'initialisation. DynamicResources sont chargés uniquement lorsque cela est nécessaire (et à chaque fois, si nécessaire). Toute modification qui est apportée à un DynamicResource est ramassé immédiatement et la propriété est mise à jour en conséquence. Il suffit de remplacer le mot-clé "StaticResource" avec "DynamicResource", et la propriété de liaison devrait mettre à jour chaque fois que la ressource changements.
Remarque: Si le StaticResource est un objet qui dérive de la Gelé de la classe, il sera également se comporter un peu comme un DynamicResource. Par exemple, si la ressource est un Pinceau, à la limite de la propriété sera mise à jour chaque fois que vous changez de Brosse objet de toute manière (en changeant son opacité, par exemple), mais cela est dû au comportement hérité de la Gelé de la classe. Toutefois, si vous remplacez la Brosse objet dans le StaticResource par une nouvelle Brosse objet, ce modification ne sera pas ramassé, parce que le changement a été effectué à la Ressource, qui est Statique, pas la Brosse.
Également Note: Même des ressources qui ne sont disponibles que StaticResources, telles que les données SystemColors, SystemFonts (qui fournissent l'accès aux paramètres du système) peut être enveloppé dans un DynamicResource pour s'assurer que la propriété est mise à jour à chaque changement. Cela peut être fait de cette façon:
<Control Property="{DynamicResource {x:Static SystemColors.XXX}}"></Control>
.OriginalL'auteur muneebshere