Привязать к значению, определенному в настройках

В WPF, могу ли я использовать привязку со значениями, определенными в настройках? Если это возможно, укажите образец.

Ответ 1

Во-первых, вам нужно добавить собственное пространство имен XML, которое создаст пространство имен, в котором определены параметры:

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

Затем в вашем файле XAML вызовите экземпляр настроек по умолчанию, используя следующий синтаксис:

{x:Static properties:Settings.Default}

Итак, вот окончательный код результата:

<ListBox x:Name="lb"
         ItemsSource="{Binding Source={x:Static properties:Settings.Default},
                               Path=Names}" />

Источник: WPF - Как привязать элемент управления к свойству, определенному в настройках?


Примечание. Как указано @Daniel и @nabulke, не забудьте установить Модификатор доступа вашего файла настроек на Public и Сфера на User

Ответ 2

Решение выше работает, но я нахожу его довольно подробным... вместо этого вы можете использовать собственное расширение разметки, которое можно использовать следующим образом:

<ListBox x:Name="lb" ItemsSource="{my:SettingBinding Names}" />

Вот код для этого расширения:

public class SettingBindingExtension : Binding
{
    public SettingBindingExtension()
    {
        Initialize();
    }

    public SettingBindingExtension(string path)
        :base(path)
    {
        Initialize();
    }

    private void Initialize()
    {
        this.Source = WpfApplication1.Properties.Settings.Default;
        this.Mode = BindingMode.TwoWay;
    }
}

Подробнее здесь: http://www.thomaslevesque.com/2008/11/18/wpf-binding-to-application-settings-using-a-markup-extension/

Ответ 3

@CSharper ответ не работал для моего приложения WPF, закодированного в VB.NET(не С#, в отличие от, видимо, 99.999% других приложений WPF), так как я получил постоянную ошибку компилятора, жалуясь, что Settings не удалось найти в MyApp.Properties пространство имен, которое не исчезнет даже после восстановления.

Что сработало вместо меня после многократного поиска в Интернете, вместо этого использовалось пространство имен local XAML, созданное по умолчанию в главном окне приложения XAML:

<Window
    <!-- Snip -->
    xmlns:local="clr-namespace:MyApp"
    <!-- Snip -->
><!-- Snip --></Window>

... и привязайте к моим настройкам через него, используя что-то вроде следующего (где MyBooleanSetting - это параметр, который я определил в своих свойствах проекта типа Boolean и область пользователя с модификатором доступа по умолчанию):

<CheckBox IsChecked="{Binding Source={x:Static local:MySettings.Default}, Path=MyBooleanSetting, Mode=TwoWay}"
          Content="This is a bound CheckBox."/>

Чтобы убедиться, что настройки действительно сохранены, обязательно вызовите

MySettings.Default.Save()

... где-то в вашем коде (например, в событии Me.Closing для вашего файла MainWindow.xaml.vb).

(запомните это сообщение сообщение в Visual Studio для вдохновения, см. ответ Мухаммада Сиддики.)