Прив’язати до значення, визначеного в налаштуваннях


78

У WPF, чи можу я використовувати прив'язку зі значеннями, визначеними в Налаштуваннях? Якщо це можливо, надайте зразок.

Відповіді:


130

По-перше, вам потрібно додати власний простір імен 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та Scope наUser


11
Я виявив, що цей метод працює, лише якщо файл налаштувань позначений як модифікатор загального доступу. shortfastcode.blogspot.com/2009/12/…
Даніель

5
Для того, щоб зберегти значення за допомогою MyApp.Properties.Settings.Default.Save(), область налаштування має бути встановлена ​​на Користувач .
nabulke

31

Наведене вище рішення працює, але я вважаю його досить багатослівним ... замість цього ви можете використовувати власне розширення розмітки, яке можна використовувати так:

<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/


1
Це чудове розширення, але, на жаль, ви втрачаєте Resharper intellisense. Не варто компромісу ІМХО, хоча слід зазначити, що я безнадійний фанат R # :)
Охад Шнайдер

@OhadSchneider, справді. Я сам використовую ReSharper, але рідко для XAML, тому що я не вважаю його таким хорошим, як у C # ...
Thomas Levesque

8

Відповідь @ CSharper не спрацювала для мого додатка WPF, кодованого у VB.NET (не C #, на відміну від, мабуть, 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 за натхнення; див. Відповідь Мухаммада Сіддікі.)


0

Ось як я пов’язую UserSettings:

Створіть змінну залежності, набравши, propdpа потім двічі табулюючи.

    public UserSettings userSettings
    {
        get { return (UserSettings)GetValue(userSettingsProperty); }
        set { SetValue(userSettingsProperty, value); }
    }
    public static readonly DependencyProperty userSettingsProperty =
        DependencyProperty.Register("userSettings", typeof(UserSettings), typeof(MainWindow), new PropertyMetadata(UserSettings.Default));

Тепер ви можете прив’язати userSettings:

Value="{Binding userSettings.SomeUserSettingHere, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

І обов’язково збережіть UserSettings під час їх зміни або на виході за допомогою:

UserSettings.Default.Save();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.