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?
Vous pouvez directement vous lier à l'objet statique créé par Visual Studio.
Dans votre déclaration Windows, ajoutez:
xmlns:p="clr-namespace:UserSettings.Properties"
où 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);
}
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
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} ... />
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.
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 .
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");
}
}
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!