2013-06-18 4 views
0

Je travaille sur une application WPF en utilisant MVVM. Sur les fenêtres principales est une liste déroulante des noms des clients. Quand un client est sélectionné, je veux montrer les adresses pour cela.WPF Contrôle Utilisateur MVVM

Je créé un contrôle utilisateur d'adresses et dans le code de la commande derrière j'ai ajouté un DP:

public static DependencyProperty CustomerIdProperty = 
    DependencyProperty.Register("CustomerId", typeof(int), typeof(AddressView)); 

public int CustomerId 
{ 
    get { return (int)GetValue(CustomerIdProperty); } 
    set { SetValue(CustomerIdProperty, value); } 
} 

Ensuite, dans la fenêtre principale, je lie le combo à CustomerId DP du contrôle de l'utilisateur:

<vw:AddressView Grid.Row="1" 
       Grid.Column="0" 
       x:Name="AddressList" 
       CustomerId="{Binding ElementName=CustomersList, Path=SelectedCustomer.Id, Mode=TwoWay}"/> 

J'ai maintenant un problème et une question:

problème: Quand je lance cela et sélectionnez un client, le poseur sur le DP ne se déclenche jamais. La propriété SelectedCustomer de la fenêtre principale se déclenche, mais pas le point de détection dans le contrôle utilisateur. Question: Comment le ViewModel pour le contrôle connaît-il le CustomerId dans le DP?

J'ai créé une application petit échantillon ici pour montrer ce que je fais:

http://sdrv.ms/17OZv1x

Je vous serais reconnaissant toute aide à ce sujet.

Merci

+0

Si la propriété de dépendance est définie via des liaisons, Get/Set ne sera pas appelé, uniquement pour l'utilisation dans le code local. Vous pouvez ajouter un PropertyChangedCallback à votre MetaData DependencyProperties si vous avez besoin de le vérifier –

+0

Ok , Je vois. Mais cela ne répond toujours pas à la question de savoir comment la valeur de l'ID client dans le code derrière arrive à ViewModel? – CoderForHire

+0

@kmarois: Via le système de reliure.Si vous voulez savoir comment cela fonctionne [commencez ici] (http://msdn.microsoft.com/en-us/library/vstudio/ms752914 (v = vs.110) .aspx) et continuez à lire. – Will

Répondre

2

au lieu d'utiliser les propriétés de dépendance, vous pouvez aller un moyen facile lorsque votre objet client a également la propriété d'adresse

<AdressView> 
    <TextBlock Text="{Binding Path=MyAddress.Name}" /> 
    <TextBlock Text="{Binding Path=MyAddress.Street}" /> 

mainwindow

<ComboBox X:Name=cbo .../> 
    <local:AddressView DataContext="{Binding ElementName=cbo, Path=SelectedItem}"/> 

customer.cs

public Address MyAddress {get;set;} 

Si vous voulez que vos trucs de propriétés de dépendances fonctionnent, vous devez publier le code pour votre addressview, de sorte que nous puissions vérifier les liens aux propriétés de dépendance et fournir des informations sur comment obtenir l'adresse avec votre customerid.

1

CustomerList est de type ComboBox et un composant ComboBox n'a pas de propriété SelectedCustomer. La propriété dont vous avez besoin pour votre reliure est SelectedItem. Vous devriez obtenir des erreurs de liaison au cours de votre session de débogage dans Visual Studio. Voir la fenêtre de sortie.

Pour que cela fonctionne, vous devez mettre à jour la liaison de CustomerId-Property à ce qui suit.

CustomerId="{Binding ElementName=CustomersList, Path=SelectedItem.Id}" 

Le TwoWay-Binding est pertinent que si vous voulez changer le Id de votre AddressView. Et je pense que tu ne le veux pas. Donc, il peut être retiré.

+0

Le Combo est lié à une liste et sa propriété SelectedItem est liée à la propriété SelectedCustomer, qui se trouvent toutes deux sur la machine virtuelle. – CoderForHire

Questions connexes