Каков наилучший способ привязать свойства WPF к ApplicationSettings в С#? Есть ли автоматический способ, например, в приложении Windows Forms? Как и этот вопрос, как (и возможно ли) сделать то же самое в WPF?
Лучший способ привязать свойства WPF к ApplicationSettings в С#?
Ответ 1
Вы можете напрямую привязываться к статическому объекту, созданному Visual Studio.
В объявлении Windows добавьте:
xmlns:p="clr-namespace:UserSettings.Properties"
где UserSettings
- пространство имен приложений.
Затем вы можете добавить привязку к правильному параметру:
<TextBlock Height="{Binding Source={x:Static p:Settings.Default},
Path=Height, Mode=TwoWay}" ....... />
Теперь вы можете сохранить настройки, например, при закрытии приложения:
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
Properties.Settings.Default.Save();
base.OnClosing(e);
}
Ответ 2
В случае если разработчик VB.Net пытается это сделать, ответ отличается от другого.
xmlns:p="clr-namespace:ThisApplication"
Обратите внимание, что .Properties не существует.
В вашей привязке это MySettings.Default, а не Settings.Default - поскольку app.config хранит его по-разному.
<TextBlock Height={Binding Source={x:Static p:MySettings.Default}, Path=Height, ...
После немного вытащить мои волосы, я обнаружил это. Надеюсь, что это поможет.
Ответ 3
Мне нравится принятый ответ, однако я столкнулся с особым случаем. Я установил текстовое поле как "только для чтения", чтобы изменить его значение только в коде. Я не мог понять, почему значение не было передано обратно в Настройки, хотя у меня был режим "TwoWay".
Затем я нашел это: http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx
По умолчанию используется значение по умолчанию, которое возвращает значение UpdateSourceTrigger по умолчанию для свойства целевой цели. Однако значением по умолчанию для большинства свойств зависимостей является свойство PropertyChanged, а свойство Text имеет значение по умолчанию LostFocus.
Таким образом, если у вас есть текстовое поле с IsReadOnly = "True", вам нужно добавить значение UpdateSourceTrigger = PropertyChanged в оператор Binding:
<TextBox Text={Binding Source={x:Static p:Settings.Default}, Path=myTextSetting, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} ... />
Ответ 4
Самый простой способ - связать с объектом, который предоставляет ваши настройки приложения как свойства или включить этот объект в качестве StaticResource и привязать его к этому.
Другим направлением, которое вы можете предпринять, является создание собственного Расширения разметки, чтобы вы могли просто использовать PropertyName = "{ApplicationSetting SomeSettingName}". Чтобы создать собственное расширение разметки, вам необходимо наследовать MarkupExtension и украсить класс MarkupExtensionReturnType. Джон Боуэн имеет сообщение
Ответ 5
Крис, я не уверен, что это лучший способ привязать ApplicationSettings, но так я сделал это в Witty.
1) Создайте свойство зависимостей для параметра, которое вы хотите связать в окне/странице/usercontrol/container. В этом случае у меня есть пользовательская настройка для воспроизведения звуков.
public bool PlaySounds
{
get { return (bool)GetValue(PlaySoundsProperty); }
set { SetValue(PlaySoundsProperty, value); }
}
public static readonly DependencyProperty PlaySoundsProperty =
DependencyProperty.Register("PlaySounds", typeof(bool), typeof(Options),
new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnPlaySoundsChanged)));
private static void OnPlaySoundsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
Properties.Settings.Default.PlaySounds = (bool)args.NewValue;
Properties.Settings.Default.Save();
}
2) В конструкторе инициализируйте значение свойства в соответствии с настройками приложения
PlaySounds = Properties.Settings.Default.PlaySounds;
3) Свяжите свойство в XAML
<CheckBox Content="Play Sounds on new Tweets" x:Name="PlaySoundsCheckBox" IsChecked="{Binding Path=PlaySounds, ElementName=Window, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
Вы можете загрузить полный остроумный источник, чтобы увидеть его в действии или просмотреть только код для окна параметров.
Ответ 6
Мне нравится делать это через ViewModel и просто выполнять привязку как обычно в XAML
public Boolean Value
{
get
{
return Settings.Default.Value;
}
set
{
Settings.Default.SomeValue= value;
Settings.Default.Save();
Notify("SomeValue");
}
}
Ответ 7
Также читайте эту статью о том, как это делается в BabySmash
Вам нужно только вернуть настройки с помощью DO (как пример Алана), если вам нужно уведомление об изменении! привязка к классу настроек POCO также будет работать!