8
votes

WPF TEXTBOX: Comment changer le mode de liaison par défaut à l'AWACE?

Initialement, j'ai le code suivant:

public class ReadOnlyTextBox : TextBox
{
    static ReadOnlyTextBox()
    {
        TextBox.TextProperty.OverrideMetadata(typeof(ReadOnlyTextBox), 
            new FrameworkPropertyMetadata() { BindsTwoWayByDefault = false, Journal = true, DefaultUpdateSourceTrigger = UpdateSourceTrigger.Explicit }); 
    }
    public ReadOnlyTextBox()
    {
        base.Background = SystemColors.ControlBrush;
        base.IsReadOnly = true;            
    }
}


2 commentaires

@Milliu, si cela va être réadonnée alors, pourquoi devriez-vous vouloir que ce soit une voie à suivre? IMHO Créer un contrôle séparé pour une propriété unique n'est pas une idée saine.


@Prince, comme ma mise à jour indiquée, une voie est due à ma propriété uniquement.


3 Réponses :


4
votes

Parce que cette zone de texte est réadonnée, le mode de liaison ne peut pas être Twoway. P>

Pourquoi pas? Isreadonly empêchera l'utilisateur de modifier le texte et de modifier ainsi la propriété. Assurez-vous simplement de ne pas modifier la propriété de texte dans le code. P>

Vous pouvez empêcher la mise à jour de la propriété liée si vous sous-classez la zone de texte. Si vous le faites, vous pouvez remplacer les métadonnées de la propriété de dépendance Textbox.Text. P>

public class TextBoxEx : TextBox
{
    public TextBoxEx() : base() { }

    static TextBoxEx()
    {
        TextBox.TextProperty.OverrideMetadata(typeof(TextBoxEx), 
            new FrameworkPropertyMetadata() { BindsTwoWayByDefault = false, Journal = true,
                DefaultUpdateSourceTrigger = System.Windows.Data.UpdateSourceTrigger.Explicit });
    }

}

5 commentaires

@foson: Merci beaucoup pour la réponse. Cette approche devrait être correcte parce que je pensais en fait créer une classe de ReadonlyTextBox dérivée de toute façon. En ce qui concerne le mode de liaison, vous avez raison. Lorsque je supprimai le mode = sur XAML, je reçois cette exception: "Une liaison TwowayAay ou OwwayTosource ne peut pas fonctionner sur la propriété en lecture seule" Logement "de type 'xxx". " Je n'ai pas regardé ce message plus étroitement. Le problème est que ma propriété Soure contraignante n'a qu'un getter. Donc, ce n'est pas lié à Isreadonly de la zone de texte. Merci encore!


@foson: Je viens de tester votre code suggéré, mais cela ne fonctionne pas. Je reçois toujours l'exception: "Une liaison TwowayAay ou OwwayyTosource ne peut pas fonctionner sur la propriété en lecture seule" Logement "de type 'xxx". ". Je posterai mon code dans la section de réponse pour le rendre plus lisible.


@Prince: ça marche pour vous? Ça ne fait pas pour moi. J'ai aussi essayé d'utiliser textproperty.adOnter (...), mais j'ai la même erreur.


@Miliu: Voulez-vous marquer cela correctement et démarrer une nouvelle question ou modifier la question à inclure que la propriété est en train de gêner?


@foson: Comme je l'ai dit, votre solution suggérée ne fonctionne pas (c'est-à-dire qu'elle ne change pas le mode de liaison par défaut de la zone de texte à l'autre). Ceci est indépendant du fait que ma propriété est en train de gêner.



3
votes

Les styles sont un moyen d'appliquer le même ensemble de personnalisations à une ou plusieurs propriétés pour les objets d'interface utilisateur. Fond, Isreadonly, etc. Propriétés de dépendance typiquement.

Le mode est une propriété de l'objet de liaison, qui n'est pas un objet UI.

Vous pouvez définir un style sur n'importe quel élément qui dérive de l'établissement FrameworkContentElement. - Source (MSDN)

Ce n'est donc pas typiquement fait via xaml / style .. ma supposition est que vous devriez écrire du code pour cela. Bien que xaml vous permet de définir des propriétés imbriquées texte.mode = "valeur", il est sujet à une erreur (car il suppose que le texte a déjà été réglé sur un objet de liaison). Il se traduira par une exception obligatoire si la propriété de texte renvoie un objet qui n'a pas de propriété en mode sur celui-ci - par exemple. Si text = "une chaîne simple".

Si vous devez absolument avoir ceci, alors vous devez créer votre liaison de manière programmatique. Vous pouvez utiliser une convention de dénomination par exemple pour voir si la propriété de support a un setter et ajoutez une liaison à une voie à suivre si elle ne le fait pas.


1 commentaires

Merci beaucoup pour votre explication qui est très utile.



3
votes

Je sais que cette question est vraiment ancienne, mais j'ai récemment rencontré ce problème moi-même, alors peut-être que je puisse aider quelqu'un d'autre aussi.

Je voulais créer une zone de texte qui possédait une zone de texte unique. J'ai découvert que cela ne fonctionne pas comme indiqué dans la question, car le WPF combine les métadonnées existantes et les métadonnées primordiales ensemble en orientant essentiellement les drapeaux ensemble. Depuis que Bindstwowayybydefault est l'un de ces drapeaux, tant que l'un des objets de métadonnées a Bindstwowaybydefault = TRUE reste vrai.

Le seul moyen de changer les métadonnées après que le processus de fusion du WPF ait des endroits dans la nervuretadata . Cependant, l'objet de métadonnées est marqué comme scellé dans la méthode.

comme tout bon développeur que je serais arrêté ici et reconsidéré ... Naaa, j'ai utilisé la réflexion pour "non pénétrer" l'objet de métadonnées et définir le bindstwowayydedefault à False.

Si quelqu'un sait un meilleur moyen de le faire s'il vous plaît faites-moi savoir.

Ici mon Code: xxx


0 commentaires