У WPF, чи можу я використовувати прив'язку зі значеннями, визначеними в Налаштуваннях? Якщо це можливо, надайте зразок.
Відповіді:
По-перше, вам потрібно додати власний простір імен 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
MyApp.Properties.Settings.Default.Save()
, область налаштування має бути встановлена на Користувач .
Наведене вище рішення працює, але я вважаю його досить багатослівним ... замість цього ви можете використовувати власне розширення розмітки, яке можна використовувати так:
<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/
Відповідь @ 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 за натхнення; див. Відповідь Мухаммада Сіддікі.)
Ось як я пов’язую 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();