Заголовок окна привязки данных к ресурсу приложения - PullRequest
8 голосов
/ 25 марта 2011

В настоящее время я делаю это так:

    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"; }
        }
    }
}

Создание приложения Windows WPF в VS2010 .NET 4.0.
Изменить 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 в WPF XAML? . И, кажется, все должно работать, но это не так.

Microsoft не дает описание этого сообщения об ошибке. Только другая тема в справочном форуме http://social.msdn.microsoft.com/Forums/en/wpf/thread/4fe7d58d-785f-434c-bef3-31bd9e400691,, которая тоже не помогает.

Ответы [ 4 ]

10 голосов
/ 25 марта 2011

В коде это будет выглядеть так, я думаю:

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

Это имеет смысл, только если в заголовке могут произойти изменения, и привязка будет уведомлена об этих изменениях (WindowName должно быть либо свойством зависимости, либо Resources необходимо реализовать INotifyPropertyChanged)

Если Properties является пространством имен (как в случае со свойствами, сгенерированными по умолчанию VS), вам нужно объявить его где-нибудь, используя xmlns и использовать x:Static:

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

Еще одно примечание: если вы используете управляемые ресурсы Visual Studio, вам нужно убедиться, что модификатор доступа к свойствам равен public, по умолчанию используется значение internal, которое вызывает исключение, поскольку привязка работает только для открытых свойств.

1 голос
/ 13 января 2012

просто удалите это:

... ;assembly=ClassLibrary1"
0 голосов
/ 01 августа 2011

Вы пытались изменить модификатор доступа к ресурсу с внутреннего на публичный?

У меня только что была какая-то проблема с этим прямо сейчас.

    /// <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);
        }
    }
0 голосов
/ 25 марта 2011

У меня фактически есть Заголовок в статическом ресурсе, определенном в верхней части приложения, и я привязываю Заголовок и все, что я хочу к нему

<s:String x:Key="ApplicationName">My Application</s:String>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...