web-dev-qa-db-fra.com

Lier à une valeur définie dans les paramètres

Dans WPF, puis-je utiliser la liaison avec des valeurs définies dans Paramètres? Si cela est possible, veuillez fournir un échantillon.

71
Moheb

Tout d'abord, vous devez ajouter un espace de noms XML personnalisé qui concevra l'espace de noms où les paramètres sont définis:

xmlns:properties="clr-namespace:TestSettings.Properties"

Ensuite, dans votre fichier XAML, accédez à l'instance de paramètres par défaut à l'aide de la syntaxe suivante:

{x:Static properties:Settings.Default}

Voici donc le code de résultat final:

<ListBox x:Name="lb"
         ItemsSource="{Binding Source={x:Static properties:Settings.Default},
                               Path=Names}" />

Source: WPF - Comment lier un contrôle à une propriété définie dans les paramètres?


Remarque: Comme indiqué par @Daniel et @nabulke, n'oubliez pas de définir Access Modifier de votre fichier de paramètres sur Public et Portée à User

117
CSharper

La solution ci-dessus fonctionne, mais je la trouve assez verbeuse ... vous pouvez utiliser une extension de balisage personnalisée à la place, qui pourrait être utilisée comme ceci:

<ListBox x:Name="lb" ItemsSource="{my:SettingBinding Names}" />

Voici le code de cette extension:

public class SettingBindingExtension : Binding
{
    public SettingBindingExtension()
    {
        Initialize();
    }

    public SettingBindingExtension(string path)
        :base(path)
    {
        Initialize();
    }

    private void Initialize()
    {
        this.Source = WpfApplication1.Properties.Settings.Default;
        this.Mode = BindingMode.TwoWay;
    }
}

Plus de détails ici: http://www.thomaslevesque.com/2008/11/18/wpf-binding-to-application-settings-using-a-markup-extension/

29
Thomas Levesque

La réponse de @ CSharper n'a pas fonctionné pour mon application WPF codée en VB.NET (pas en C #, contrairement à apparemment 99,999% des autres applications WPF), car j'ai eu une erreur de compilation persistante se plaignant que Settings était introuvable dans le MyApp.Properties namespace, qui ne disparaîtrait pas même après la reconstruction.

Ce qui a plutôt fonctionné pour moi, après de nombreuses recherches en ligne, a été d'utiliser à la place l'espace de noms XAML local créé par défaut dans le fichier XAML de la fenêtre principale de mon application:

<Window
    <!-- Snip -->
    xmlns:local="clr-namespace:MyApp"
    <!-- Snip -->
><!-- Snip --></Window>

... et lier à mes paramètres à travers elle en utilisant quelque chose comme ce qui suit (où MyBooleanSetting est un paramètre que j'ai défini dans mes propriétés de projet de type Boolean et de portée utilisateur, avec le modificateur d'accès ami par défaut ):

<CheckBox IsChecked="{Binding Source={x:Static local:MySettings.Default}, Path=MyBooleanSetting, Mode=TwoWay}"
          Content="This is a bound CheckBox."/>

Pour vous assurer que les paramètres sont réellement enregistrés, assurez-vous d'appeler

MySettings.Default.Save()

... quelque part dans votre code-behind (comme dans le Me.Closing événement pour votre MainWindow.xaml.vb fichier).

(Mention de cette publication sur le forum Visual Studio pour l'inspiration; voir la réponse de Muhammad Siddiqi.)

8