2010-10-15 14 views
1

J'essaie actuellement de convertir un formulaire wpf avec plusieurs zones de texte sur RichTextBoxes pour permettre une meilleure fonctionnalité d'édition. Les zones de texte d'origine étaient toutes liées à une classe de stockage sous-jacente utilisant la liaison de données à un contexte de données lors de la navigation vers la page. À l'origine, les liaisons dans la zone de texte auraient simplement traversé et lié à la classe Storage via le contexte de données comme cela.Accès aux propriétés d'une classe pour la liaison de données avec RichTextBoxes dans WPF

<TextBox 
    Name="IntroText" 
    Text="{Binding IntroFormText} 
    SpellCheck.IsEnabled="True" /> 

Ceci serait ensuite lié automatiquement via la liaison de données à _storage.IntroFormText. Pour autoriser les liaisons de données bidirectionnelles dans les RichTextBoxes, une implémentation personnalisée basée sur les idées de l'article this a été utilisée. Les problèmes surviennent lorsque vous essayez de lier les liaisons de données aux propriétés de la classe Storage. Avec les RichTextBoxes la déclaration suivante est utilisée:

<Utils:BindableRichTextBox 
    x:Name="IntroductionText" 
    Document="{Binding {Path=IntroFormText, ElementName=dataEntryPage, Mode=TwoWay, Converter={StaticResource StringToXamlConverter}}" 
    SpellCheck.IsEnabled="True" /> 

L'idée est alors de surcharger les accesseurs de la propriété concernée, en ajoutant les lignes suivantes à la classe DataEntryPage.

private static readonly DependencyProperty introProperty = DependencyProperty.Register("IntroFormText", typeof(string), typeof(Storage)); 

public string IntroFormText 
{ 
    get { return (string) GetValue(DocumentProperty); } 
    set { SetValue(DocumentProperty, value); } 
} 

Le problème que j'ai ici cependant, est que la propriété, il doit être lié à, réside dans la classe de stockage, et non pas dans la classe DataEntryPage. Est-il possible de faire en sorte que DependencyProperty se lie efficacement aux propriétés de la classe Storage (comme le fait automatiquement TextBox), ou vais-je devoir écrire une sorte de remplacement piraté pour ce comportement? Je suppose que j'ai besoin de surcharger les getters/setters pour la classe Storage.Properties à l'intérieur de de la classe DataEntryPage pour lui permettre de pointer sur DependencyProperty correctement?

En raison de la nature du système, la suppression du système de liaison de contexte de données n'est pas vraiment une option malheureusement (plus je n'ai pas la permission de modifier la conception si fortement!). Heureusement, cela pourrait avoir du sens pour quelqu'un qui a déjà été confronté à la question!

Répondre

1

Si vous utilisez déjà un contrôle qui définit la propriété Document comme DependencyProperty pour vous, vous n'avez pas besoin d'en déclarer un autre pour la source de liaison. Seule la cible d'une liaison (dans ce cas document) doit être un DP. Si le contrôle est écrit correctement, vous devriez pouvoir utiliser la même liaison qu'avec le TextBox, en supposant que le contenu de cette chaîne fournira une entrée appropriée à votre StringToXamlConverter pour produire un FlowDocument. J'espère que ce n'est pas votre code actuel, mais si c'est le cas, votre déclaration DP (que vous ne devriez pas avoir besoin dans ce cas) a de nombreuses erreurs. Les PDD doivent avoir un format très spécifique pour que leurs déclarations fonctionnent correctement. Il est généralement préférable d'utiliser un extrait de code pour le générer, surtout si vous n'avez pas une bonne compréhension de la manière dont toutes les parties sont liées entre elles.

+0

Ce n'est en effet pas mon code exact, plus un résumé/sous-ensemble d'une base de code plutôt plus grande. En fin de compte, il s'est avéré plus simple de quitter DataBindings après d'autres discussions. Je vois d'où vous venez avec les choses de DependencyProperty, je pense qu'au bout du compte je n'en ai tout simplement pas assez bien compris pour l'utiliser vraiment proprement et efficacement pour ce projet. L'idée m'intrigue cependant, et c'est certainement quelque chose que je regarderai plus dans le futur! Un article décent sur le matériel DP personnalisé serait bon à trouver si pour référence future! :) – Smallgods

+0

L'article MSDN (http://msdn.microsoft.com/en-us/library/ms752914.aspx) est en fait un assez bon aperçu. Je me limiterai aux quelques premières sections de «Définition des valeurs de propriété» pour commencer. –