48 votes

Meilleur moyen de lier les propriétés WPF à ApplicationSettings en C# ?

Quelle est la meilleure façon de lier les propriétés WPF à ApplicationSettings en C# ? Existe-t-il un moyen automatique comme dans une application Windows Forms ? Similaire à cette question Comment (et est-il possible de) faire la même chose en WPF ?

103voto

sacha Points 2168

Vous pouvez vous lier directement à l'objet statique créé par Visual Studio.

Dans votre déclaration de Windows, ajoutez :

xmlns:p="clr-namespace:UserSettings.Properties"

donde UserSettings est l'espace de nom de l'application.

Vous pouvez ensuite ajouter une reliure au réglage correct :

<TextBlock Height="{Binding Source={x:Static p:Settings.Default}, 
           Path=Height, Mode=TwoWay}" ....... />

Vous pouvez maintenant sauvegarder les paramètres, par exemple lorsque vous fermez votre application :

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    Properties.Settings.Default.Save();
    base.OnClosing(e); 
}

9voto

TknoSpz Points 31

Si vous êtes un VB.Net Le développeur qui tente de le faire, la réponse est un peu différente.

xmlns:p="clr-namespace:ThisApplication"

Remarquez que le .Properties n'est pas là.


Dans votre binding, c'est MySettings.Default, au lieu de Settings.Default - puisque l'app.config le stocke différemment.

<TextBlock Height={Binding Source={x:Static p:MySettings.Default}, Path=Height, ...

Après m'être un peu arraché les cheveux, j'ai découvert ceci. J'espère que cela vous aidera

7voto

Remus Points 893

J'aime la réponse acceptée, mais j'ai rencontré un cas particulier. J'avais configuré ma zone de texte en "lecture seule" afin de pouvoir en modifier la valeur uniquement dans le code. Je n'arrivais pas à comprendre pourquoi la valeur n'était pas répercutée dans les paramètres alors que le mode était "TwoWay".

Puis, j'ai trouvé ça : http://msdn.microsoft.com/en-us/library/system.Windows.data.binding.updatesourcetrigger.aspx

La valeur par défaut est Default, qui renvoie la valeur par défaut de UpdateSourceTrigger de la propriété de dépendance cible. Cependant, la valeur par défaut de la plupart des propriétés de dépendance est PropertyChanged, alors que la propriété Text a une valeur par défaut de LostFocus .

Ainsi, si vous avez une zone de texte avec la propriété IsReadOnly="True", vous devez ajouter une valeur UpdateSourceTrigger=PropertyChanged à l'instruction Binding :

<TextBox Text={Binding Source={x:Static p:Settings.Default}, Path=myTextSetting, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} ... />

5voto

Richard Szalay Points 42486

Le plus simple est de se lier à un objet qui expose les paramètres de l'application sous forme de propriétés ou d'inclure cet objet en tant que StaticResource et de s'y lier.

Une autre direction que vous pourriez prendre est la création de votre propre Extension du balisage vous pouvez donc simplement utiliser PropertyName="{ApplicationSetting SomeSettingName}". Pour créer une extension de balisage personnalisée, vous devez hériter de MarkupExtension et décorer la classe avec un MarkupExtensionReturnType attribut. John Bowen a un post sur la création d'une MarkupExtension personnalisée qui pourrait rendre le processus un peu plus clair.

3voto

Alan Le Points 3375

Kris, je ne suis pas sûr que ce soit la meilleure façon de lier les ApplicationSettings, mais voici comment je l'ai fait en Witty .

1) Créez une propriété de dépendance pour le paramètre que vous voulez lier dans la fenêtre/page/usercontrol/container. Dans ce cas, j'ai un paramètre utilisateur qui permet de jouer des sons.

    public bool PlaySounds
    {
        get { return (bool)GetValue(PlaySoundsProperty); }
        set { SetValue(PlaySoundsProperty, value); }
    }

    public static readonly DependencyProperty PlaySoundsProperty =
        DependencyProperty.Register("PlaySounds", typeof(bool), typeof(Options),
        new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnPlaySoundsChanged)));

    private static void OnPlaySoundsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        Properties.Settings.Default.PlaySounds = (bool)args.NewValue;
        Properties.Settings.Default.Save();
    }

2) Dans le constructeur, initialisez la valeur de la propriété pour qu'elle corresponde aux paramètres de l'application.

      PlaySounds = Properties.Settings.Default.PlaySounds;

3) Lier la propriété dans XAML

      <CheckBox Content="Play Sounds on new Tweets" x:Name="PlaySoundsCheckBox" IsChecked="{Binding Path=PlaySounds, ElementName=Window, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

Vous pouvez télécharger la version complète Une source pleine d'esprit pour le voir en action ou pour parcourir seulement le code pour la fenêtre des options .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X