数据绑定窗口标题到应用程序资源

时间:2011-03-25 13:17:05

标签: c# wpf xaml data-binding

目前我这样做:

    public MainWindow()
    {
        InitializeComponent();
        Title = Properties.Resources.WindowName;
    }

如何通过WPF绑定做同样的事情?

编辑:它仍然无法在XAML中使用。
环境:VS2010,.NET 4.0,Windows 7.
复制步骤:
使用代码:

创建类库ClassLibrary1
 namespace ClassLibrary1
 {
    static public class Class1
    {
        static public string Something
        {
            get { return "something"; }
        }
    }
}

在VS2010 .NET 4.0中创建WPF窗口应用程序 编辑主窗口的XAML:

<Window x:Class="ahtranslator.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
    xmlns:ClassLibrary1="clr-namespace:ClassLibrary1;assembly=ClassLibrary1" 
    Title="{Binding Source={x:Static ClassLibrary1:Class1}, Path=Something}"
    Height="350" Width="525" Icon="/ahtranslator;component/Icon1.ico"    WindowStyle="SingleBorderWindow" ShowInTaskbar="False" DataContext="{Binding}">

...

编译错误消息:
MainWindow.xaml(7,130):错误MC3029:'ClassLibrary1:Class1'成员无效,因为它没有合格的类型名称。

我也找到了这个话题My.Resources in WPF XAML?。 似乎一切都应该有效,但事实并非如此。

Microsoft未提供此错误消息的说明。只有帮助论坛http://social.msdn.microsoft.com/Forums/en/wpf/thread/4fe7d58d-785f-434c-bef3-31bd9e400691中的另一个主题,这也无济于事。

4 个答案:

答案 0 :(得分:10)

在代码中,我认为它看起来像这样:

Binding titleBinding = new Binding("WindowName");
titleBinding.Source = Properties.Resources;
this.SetBinding(Window.Title, titleBinding);

只有在标题发生更改时才会有意义,并且会通知绑定这些更改(WindowName必须是依赖属性或Resources需要实现INotifyPropertyChanged

如果Properties是命名空间(就像默认的VS生成的属性一样),您需要使用xmlns&amp;使用x:Static

<Window
   ...
   xmlns:prop="clr-namespace:App.Properties"
   Title="{Binding Source={x:Static prop:Resources.WindowName}}">

另一个注意事项:如果使用Visual Studio的托管资源,则需要确保属性的访问修饰符为public,默认为internal,这将引发异常,因为绑定仅起作用对于公共财产。

答案 1 :(得分:1)

删除它:

... ;assembly=ClassLibrary1"

答案 2 :(得分:0)

我实际上在应用程序顶部定义的静态资源中有Title,我将Title和其他任何我想要的东西绑定

<s:String x:Key="ApplicationName">My Application</s:String>

答案 3 :(得分:0)

您是否尝试将资源的访问修饰符从内部更改为公用?

我现在遇到了一些问题。

    /// <summary>
    ///   Looks up a localized string similar to Has been impossible to load the configuration information.
    /// </summary>
    internal static string ERROR_NoConfigurationLoaded {
        get {
            return ResourceManager.GetString("ERROR_NoConfigurationLoaded", resourceCulture);
        }
    }

    /// <summary>
    ///   Looks up a localized string similar to Has been impossible to load the configuration information.
    /// </summary>
    public static string ERROR_NoConfigurationLoaded {
        get {
            return ResourceManager.GetString("ERROR_NoConfigurationLoaded", resourceCulture);
        }
    }