2010-07-28 10 views
0

Je crée un petit programme de finances personnelles qui utilise les «enveloppes» comme méthode de budgétisation. Je le fais principalement comme un moyen d'apprendre WPF & MVVM. J'ai rencontré un problème où je ne peux pas DataBind aux propriétés personnalisées que j'ai créé dans mon ObservableCollection personnalisé, vu ici:Problème de liaison de données avec les propriétés ObservableCollection personnalisées

public class ObservableEnvelopeCollection : ObservableCollection<Envelope> 
{ 
    public decimal Total 
    { 
     get 
     { 
      decimal total = 0; 
      foreach (Envelope env in this) 
      { 
       total += env.Balance; 
      } 
      return total; 
     } 
    } 

    public decimal SavingsTotal 
    { 
     get 
     { 
      blah blah. . . 
     } 
    } 
} 

Je suis en mesure de DataBind mon DataGrid à la collection sans problème, mais en dessous de ma grille de données, j'ai des étiquettes dont j'ai besoin pour afficher le total des soldes pour les enveloppes de la collection. Je suis capable de créer une base de données avec la propriété Count de la collection, qui est une propriété de la classe ObservableCollection parente, mais je ne peux pas créer de base de données vers Total ou SavingsTotal à partir de ma classe personnalisée. L'étiquette est simplement vide lorsque le programme est exécuté, et si j'utilise le concepteur VS2010 et que j'accède au petit assistant de liaison de données pour le contenu de l'étiquette, il affiche 'Total' et affiche l'info-bulle: n'a pas pu être résolu. " Encore une fois, si je change de chemin vers EnvColl.Count cela fonctionne.

<Label Content="{Binding Path=EnvColl.Total}"/> 

Une note plus, dans mon ViewModel je peux accéder aux propriétés et au total SavingsTotal dans ma collection sans problème, il est juste en XAML/databinding que cela ne fonctionne pas.

+0

Avez-vous essayé avec BindsDirectlyToSource = true sur la liaison? –

Répondre

0

Bah! Je déteste quand des choses comme ça arrivent ... Je suis allé ajouter BindsDirectlyToSource = true par Kent et je l'ai ajouté au mauvais endroit, provoquant une erreur de construction. Je l'ai ensuite retiré et reconstruit, et la connexion de données a soudainement commencé à fonctionner. . . : \ J'ai reconstruit la solution plusieurs fois sans succès, mais en provoquant une erreur de compilation puis en l'enlevant, les choses ont commencé à fonctionner. Je me demande s'il y a quelque chose de bogué dans le compilateur de 2010 ...?

0

VS2010

(comme toujours de nouveaux Commers pourraient avoir besoin de savoir à ce sujet.)

ce qui est arrivé à moi quand je courais l'application en mode débogage plusieurs fois et suddently je dois tuer/Arrêtez le débogueur, puis je remarque qu'il ne sait pas quand il doit recompiler le code.

Je remarque que si je ferme et rouvre l'application/solution qui aide beaucoup. Si vous utilisez le mode de débogage, vous devez le faire de temps en temps.

0

Je sais que cela a été publié, il y a quelques années, mais j'ai eu un problème similaire où j'avais une Grid qui contenait un Label et un DataGrid. J'ai été en mesure de définir le ItemsSource de mon DataGrid à un ObservableCollection, mais je n'ai pas pu accéder aux propriétés souhaitées dans mon Label. Donc ce que j'ai fait a été mis le DataContext de mon contenant Grid au ObservableCollection, puis j'ai utilisé la propriété RelativeSource de ma liaison pour trouver l'ancêtre (Grid). La syntaxe ressemblait à ceci:

<Grid DataContext = "{Binding MyObservableCollection}"> 
    <Label Content = "{Binding MyDesiredProperty}"/> 
    <DataGrid ItemsSource = "{Binding Path=DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestoryType={x:Type Grid}}}"> 
    </DataGrid> 
</Grid> 

Je pense que cela correspond à ce que recherchait l'affiche originale. Et j'espère que sinon ça peut aider d'autres.