将WPF属性绑定到C#中的ApplicationSettings的最佳方法?
将WPF属性绑定到C#中的ApplicationSettings的最佳方法是什么? 是否有像Windows窗体应用程序中的自动方式? 类似于这个问题 ,你怎样(也有可能)在WPF中做同样的事情?
您可以直接绑定到由Visual Studio创build的静态对象。
在你的Windows声明中添加:
xmlns:p="clr-namespace:UserSettings.Properties"
其中UserSettings
是应用程序名称空间。
然后你可以添加一个绑定到正确的设置:
<TextBlock Height="{Binding Source={x:Static p:Settings.Default}, Path=Height, Mode=TwoWay}" ....... />
现在,您可以保存设置,例如closures应用程序时的示例:
protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { Properties.Settings.Default.Save(); base.OnClosing(e); }
我喜欢被接受的答案,但我遇到了一个特例。 我把我的文本框设置为“只读”,这样我就可以只在代码中改变它的值。 我不明白为什么值不传播到设置,虽然我有模式为“双向”。
然后,我发现这个: http : //msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx
缺省值是Default,它将返回目标依赖项属性的默认UpdateSourceTrigger值。 但是,大多数依赖属性的默认值是PropertyChanged,而Text属性的默认值是LostFocus 。
因此,如果具有IsReadOnly =“True”属性的文本框,则必须将UpdateSourceTrigger = PropertyChanged值添加到Binding语句中:
<TextBox Text={Binding Source={x:Static p:Settings.Default}, Path=myTextSetting, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} ... />
如果你是一个VB.Net开发人员试图这样做,答案是smidge不同。
xmlns:p="clr-namespace:ThisApplication"
注意.Properties不在那里。
在你的绑定它的MySettings.Default,而不是Settings.Default – 因为app.config存储它不同。
<TextBlock Height={Binding Source={x:Static p:MySettings.Default}, Path=Height, ...
拉了一下我的头发后,我发现了这一点。 希望能帮助到你
最简单的方法是绑定到一个对象,该对象将您的应用程序设置作为属性公开或将该对象包含为StaticResource并绑定到该对象。
你可以采取的另一个方向是创build你自己的标记扩展,所以你可以简单地使用PropertyName =“{ApplicationSetting SomeSettingName}”。 要创build自定义标记扩展,您需要inheritanceMarkupExtension并使用MarkupExtensionReturnType属性修饰类。 John Bowen 在创build自定义的MarkupExtension方面有一个post ,可能会使这个过程更加清晰。
克里斯,我不确定这是绑定ApplicationSettings的最好方法,但这是我在Witty中做的 。
1)为要绑定在窗口/页面/用户控件/容器中的设置创build一个依赖项属性。 这是我有一个用户设置播放声音的情况。
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)在构造函数中,初始化属性值以匹配应用程序设置
PlaySounds = Properties.Settings.Default.PlaySounds;
3)绑定XAML中的属性
<CheckBox Content="Play Sounds on new Tweets" x:Name="PlaySoundsCheckBox" IsChecked="{Binding Path=PlaySounds, ElementName=Window, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
您可以下载完整的Witty源代码来查看它,或者只浏览选项窗口的代码 。
我喜欢通过ViewModel来完成,只需在XAML中正常执行绑定即可
public Boolean Value { get { return Settings.Default.Value; } set { Settings.Default.SomeValue= value; Settings.Default.Save(); Notify("SomeValue"); } }
另请阅读这篇文章,了解它是如何在BabySmash中完成的
如果您需要更改通知,您只需要使用DO(如Alan的示例)备份设置! 绑定到POCO设置类也将工作!
- 由于.NET有一个垃圾收集器,为什么我们需要finalizer / destructors / dispose-pattern?
- C#Timespan毫秒与TotalMilliseconds
- types是在未引用的程序集中定义的,如何find原因?
- .NET 3.5图表控件exception:执行ChartImg.axd的子请求时出错
- ThreadAbortException
- XML文件中用于date/时间的正确格式是什么?
- Entity Framework 4 Single()vs First()vs FirstOrDefault()
- 如何添加评论到WPF中的Xaml文件?
- 你能帮我理解Moq Callback吗?