web-dev-qa-db-fra.com

La meilleure façon 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 dans WPF?

47
Kris Erickson

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

Dans votre déclaration Windows, ajoutez:

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

UserSettings est l'espace de noms de l'application.

Ensuite, vous pouvez ajouter une liaison au paramètre correct:

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

Vous pouvez maintenant enregistrer 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); 
}
102
Sacha Bruttin

Dans le cas où vous êtes un développeur VB.Net, la réponse est légèrement différente.

xmlns:p="clr-namespace:ThisApplication"

Notez que les propriétés ne sont pas là.


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

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

Après avoir un peu arraché mes cheveux, je l'ai découvert. J'espère que ça aide

9
TknoSpz

J'aime la réponse acceptée, j'ai cependant rencontré un cas spécial. J'ai eu ma zone de texte définie comme "en lecture seule" afin que je puisse en modifier la valeur uniquement dans le code. Je ne pouvais pas comprendre pourquoi la valeur ne se propageait pas dans les paramètres alors que j'avais le mode "TwoWay".

Ensuite, j'ai trouvé ceci: http://msdn.Microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx

La valeur par défaut est Default, qui renvoie la valeur UpdateSourceTrigger par défaut 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, tandis que la propriété Text a la valeur par défaut LostFocus .

Ainsi, si vous avez la 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} ... />
7
Remus

Le moyen le plus simple serait de lier à un objet qui expose vos paramètres d'application en tant que propriétés ou d'inclure cet objet en tant que StaticResource et de le lier à cela.

Vous pouvez également créer votre propre Markup Extension afin que vous puissiez simplement utiliser PropertyName = "{ApplicationSetting SomeSettingName}". Pour créer une extension de balisage personnalisée, vous devez hériter MarkupExtension et décorer la classe avec un attribut MarkupExtensionReturnType . John Bowen a un publication sur la création d'un MarkupExtension personnalisé qui pourrait rendre le processus un peu plus clair.

5
Richard Szalay

Kris, je ne suis pas sûr que ce soit la meilleure façon de lier ApplicationSettings, mais c'est ainsi que je l'ai fait dans Witty .

1) Créez une propriété de dépendance pour le paramètre que vous souhaitez lier dans la fenêtre/page/usercontrol/container. C'est le cas, j'ai un réglage utilisateur pour 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) Liez la propriété en 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 l'intégralité source Witty pour le voir en action ou parcourir simplement code pour la fenêtre d'options .

3
Alan Le

J'aime le faire via le ViewModel et juste faire la liaison comme d'habitude dans le XAML

    public Boolean Value
    {
        get
        {
            return Settings.Default.Value;

        }
        set
        {
            Settings.Default.SomeValue= value;
            Settings.Default.Save();
            Notify("SomeValue");
        }
    }
2
NathofGod

Lisez aussi this article sur la façon dont cela se fait dans BabySmash

Vous n'avez besoin de sauvegarder les paramètres avec DO (comme l'exemple d'Alan) que si vous avez besoin de la notification de changement! la liaison à la classe Paramètres POCO fonctionnera également!

0
rudigrobler