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 ?
Réponses
Trop de publicités?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);
}
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
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} ... />
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.
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 .