tutorial - ¿La mejor forma de enlazar propiedades de WPF con ApplicationSettings en C#?
wpf vs windows forms (7)
Kris, no estoy seguro de que esta sea la mejor manera de vincular ApplicationSettings, pero así es como lo hice en Witty .
1) Cree una propiedad de dependencia para la configuración que desea vincular en la ventana / página / usercontrol / contenedor. Este es el caso en que tengo una configuración de usuario para reproducir sonidos.
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) En el constructor, inicialice el valor de la propiedad para que coincida con la configuración de la aplicación
PlaySounds = Properties.Settings.Default.PlaySounds;
3) Enlace la propiedad en XAML
<CheckBox Content="Play Sounds on new Tweets" x:Name="PlaySoundsCheckBox" IsChecked="{Binding Path=PlaySounds, ElementName=Window, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
Puede descargar la fuente Witty completa para verla en acción o explorar solo el código de la ventana de opciones .
¿Cuál es la mejor manera de enlazar propiedades de WPF a ApplicationSettings en C #? ¿Hay una manera automática como en una aplicación de Windows Forms? Al igual que en esta pregunta , ¿cómo (y es posible) hacer lo mismo en WPF?
La manera más fácil sería enlazar a un objeto que expone la configuración de la aplicación como propiedades o incluir ese objeto como StaticResource y vincularlo a eso.
Otra dirección que podría tomar es crear su propia extensión de marcado para que simplemente pueda usar PropertyName = "{ApplicationSetting SomeSettingName}". Para crear una extensión de marcado personalizado, necesita heredar la ampliación de MarkupExtension y decorar la clase con un atributo MarkupExtensionReturnType . John Bowen tiene una publicación sobre la creación de una extensión de marcado personalizada que puede aclarar un poco el proceso.
Lea también este artículo sobre cómo se hace en BabySmash
Solo necesita respaldar la configuración con DO (como el ejemplo de Alan) si necesita la notificación de cambio. ¡el enlace a la clase de Configuración de POCO también funcionará!
Me gusta la respuesta aceptada, pero encontré un caso especial. Tuve mi cuadro de texto configurado como "solo lectura" para que pueda cambiar el valor de él solo en el código. No pude entender por qué el valor no se propagó a la configuración aunque tenía el modo como "TwoWay".
Entonces, encontré esto: http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx
El valor predeterminado es Predeterminado, que devuelve el valor predeterminado UpdateSourceTrigger de la propiedad de dependencia de destino. Sin embargo, el valor predeterminado para la mayoría de las propiedades de dependencia es PropertyChanged, mientras que la propiedad Text tiene un valor predeterminado de LostFocus .
Por lo tanto, si tiene el cuadro de texto con la propiedad IsReadOnly = "True", debe agregar un valor UpdateSourceTrigger = PropertyChanged a la declaración de enlace:
<TextBox Text={Binding Source={x:Static p:Settings.Default}, Path=myTextSetting, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} ... />
En caso de que usted sea un desarrollador de VB.Net que intenta esto, la respuesta es una pizca diferente.
xmlns:p="clr-namespace:ThisApplication"
Observe que .Properties no está allí.
En su enlace es MySettings.Default, en lugar de Settings.Default, ya que el app.config lo almacena de manera diferente.
<TextBlock Height={Binding Source={x:Static p:MySettings.Default}, Path=Height, ...
Después de sacarme un poco el pelo, descubrí esto. Espero eso ayude
Puede vincular directamente al objeto estático creado por Visual Studio.
En su declaración de Windows, agregue:
xmlns:p="clr-namespace:UserSettings.Properties"
donde UserSettings
es el espacio de nombres de la aplicación.
Luego puede agregar un enlace a la configuración correcta:
<TextBlock Height="{Binding Source={x:Static p:Settings.Default},
Path=Height, Mode=TwoWay}" ....... />
Ahora puede guardar la configuración, por ejemplo, al cerrar su aplicación:
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
Properties.Settings.Default.Save();
base.OnClosing(e);
}
Me gusta hacerlo a través del ViewModel y simplemente hacer el enlace de forma normal en el XAML
public Boolean Value
{
get
{
return Settings.Default.Value;
}
set
{
Settings.Default.SomeValue= value;
Settings.Default.Save();
Notify("SomeValue");
}
}