2010-09-29 5 views
3

J'ai un problème avec les liaisons dans wpf. J'ai découvert un problème étrange. J'ai la classe ConfiugrationStringBuilder qui hérite de DbConnectionStringBuilder. Quand je ne SMTH comme ceLiaison étrange wpf

public class ConfiugrationStringBuilder : DbConnectionStringBuilder 
{ 
    public string Directory { get;set; } 
} 

ConfiugrationStringBuilder builder = new ConfiugrationStringBuilder(connStr); 

builder.Directory = "d:\dir"; //my property 

txtBox.DataContext = builder; 

puis ajoutez la liaison à XAML pour txtBox

<TextBox Name="txtBox" Text="{Binding Path=Directory}"></TextBox> 

Le problème est que le code ci-dessus ne fonctionne pas. Je ne peux pas lier à ma propriété de classe, mais je peux lier aux propriétés publiques de la base DbConnectionStringBuilder.

Et la chose la plus drôle est que quand je supprimer l'héritage de DbConnectionStringBuilder

donc mon code ressemble à ceci

public class ConfiugrationStringBuilder 
{ 
    public string Directory { get;set; } 
} 

Dans ce cas, les travaux de liaison ci-dessus bien. Je ne peux pas trouver d'informations sur de tels cas et pourquoi dans ce cas, la liaison ne fonctionne pas? Quelqu'un peut-il expliquer un tel comportement?

Pendant que j'écrivais le qusetion, j'ai essayé d'étudier ce qui est un problème. Et découvert que DbConnectionStringBuilder a indexeur, alors quand essayer de lier à Path=Directory sur les coulisses, il fait builder["Directory"] pas builder.Directory. De toute façon, quelqu'un peut-il me dire pourquoi il le fait?

Répondre

3

Il est une partie de la liaison-'Magic » pour soutenir des scénarios maître-détail (voir here pour une description complète). Fondamentalement, lorsque votre objet implémente IEnumerable, un TextBox essayera de se lier à une collection, ce qui signifie qu'il recherchera l'élément en cours.

Pour contourner ce problème - je chercherais probablement à envelopper le DBConnectionStringBuilder au lieu d'en hériter (aussi, vous feriez mieux d'adhérer à la composition sur l'héritage).