将TextBox绑定到设置是不起作用的

时间:2014-10-25 19:06:21

标签: c# wpf data-binding textbox

我很喜欢使用一些WPF代码而且我有一个很大的问题。我添加了由visual studio生成的设置,我想在窗口中使用它作为绑定。所以我创造了类似的东西:

<TextBox VerticalAlignment="Center" Grid.Row="0" Grid.Column="1" Name="username_textbox"   Text="{Binding Source={StaticResource Settings}, Mode=TwoWay, Path=Default.Password}" />

当我在App.xaml声明时,没关系:

<Application x:Class="BlinkLinkClient.App"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:properties="clr-namespace:BlinkLinkClient.Properties"
            ShutdownMode="OnExplicitShutdown">
   <Application.Resources>
       <ResourceDictionary>
           <ResourceDictionary.MergedDictionaries>
              <ResourceDictionary Source="GeneralResourceDictionary.xaml" />
           </ResourceDictionary.MergedDictionaries>
           <properties:Settings x:Key="Settings" />
       </ResourceDictionary>
   </Application.Resources>
</Application>

但我在网上发现这种方法有时会崩溃,所以我使用了其他方法:

 <TextBox VerticalAlignment="Center" Grid.Row="1" Name="password_textbox" Text="{Binding Source={x:Static properties:Settings.Default}, Path=password}" Grid.Column="1" />

我的专业名称空间是:

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

绑定期间输出错误

  

System.Windows.Data错误:40:BindingExpression路径错误:'对象'''设置'(HashCode = 32985660)'上找不到'用户名'属性。 BindingExpression:路径=用户名; DataItem ='Settings'(HashCode = 32985660); target元素是'TextBox'(Name =''); target属性是'Text'(类型'String')

设置类(只有一个道具,每个道具类似):

namespace BlinkLinkClient {


    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

    [global::System.CodeDom.Compiler.GeneratedCodeAttribute
    ("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
    public partial class Settings : global::System.Configuration.ApplicationSettingsBase {

    private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));

    public static Settings Default {
        get {
            return defaultInstance;
        }
    }

    [global::System.Configuration.UserScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Configuration.DefaultSettingValueAttribute("user@gmail.com")]
    public string Username {
        get {
            return ((string)(this["Username"]));
        }
        set {
            this["Username"] = value;
        }
    }
}

没有任何事情发生,数据没有存储甚至显示(我提供默认值,并在其他代码中设置,我可以完全访问它)。我做错了什么?感谢

1 个答案:

答案 0 :(得分:1)

第二种方法(StaticExtension获取Settings实例+ Binding,设置名称为Path)是正确的。第一种方法不起作用,因为它创建了一个单独的设置实例并且路径不正确(您无法绑定到静态属性)。

请检查信件案例。在第一个示例中,属性名为Password,但在第二个示例中为password。在“输出”窗口中查找绑定错误。您也可以尝试使用PresentationTraceSources.TraceLevel附加属性进行调试。

此外,为了保存属性,您需要在某处调用Save()方法。绑定只会更改属性值,它不会存储它们。