Лучший способ привязать свойства WPF к ApplicationSettings в C #? - PullRequest
47 голосов
/ 30 сентября 2008

Каков наилучший способ привязать свойства WPF к ApplicationSettings в C #? Есть ли автоматический способ, как в приложении Windows Forms? Подобно этому вопросу , как (и возможно ли) сделать то же самое в WPF?

Ответы [ 7 ]

101 голосов
/ 05 ноября 2008

Вы можете напрямую связать статический объект, созданный 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); 
}
9 голосов
/ 10 февраля 2012

В случае, если вы VB.Net разработчик, пытающийся это сделать, ответ будет немного другим.

xmlns:p="clr-namespace:ThisApplication"

Обратите внимание. Свойства не существует.


В вашей привязке это MySettings.Default, а не Settings.Default - поскольку app.config хранит его по-другому.

<TextBlock Height={Binding Source={x:Static p:MySettings.Default}, Path=Height, ...

Немного выдернув волосы, я обнаружил это. Надеюсь, это поможет

7 голосов
/ 20 октября 2010

Мне нравится принятый ответ, но я столкнулся с особым случаем. Моё текстовое поле было установлено как «только для чтения», так что я могу изменить его значение только в коде. Я не мог понять, почему значение не было передано обратно в настройки, хотя у меня был режим «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} ... />
5 голосов
/ 01 октября 2008

Самым простым способом будет привязка к объекту, который выставляет настройки вашего приложения в качестве свойств, или включение этого объекта в качестве StaticResource и привязка к нему.

Еще одно направление, которое вы можете выбрать, - это создать собственное расширение разметки , чтобы вы могли просто использовать PropertyName = "{ApplicationSetting SomeSettingName}". Чтобы создать собственное расширение разметки, вам нужно унаследовать MarkupExtension и украсить класс атрибутом MarkupExtensionReturnType . Джон Боуэн имеет сообщение о создании пользовательского MarkupExtension , которое может сделать процесс немного более понятным.

3 голосов
/ 01 октября 2008

Крис, я не уверен, что это лучший способ связать 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}" />

Вы можете скачать полный Остроумный исходный код , чтобы увидеть его в действии или просто просмотреть код для окна настроек .

2 голосов
/ 01 июля 2013

Мне нравится делать это через ViewModel и просто делать привязку как обычно в XAML

    public Boolean Value
    {
        get
        {
            return Settings.Default.Value;

        }
        set
        {
            Settings.Default.SomeValue= value;
            Settings.Default.Save();
            Notify("SomeValue");
        }
    }
0 голосов
/ 01 октября 2008

Также прочитайте эту статью о том, как это делается в BabySmash

Вам нужно только восстановить настройки с помощью DO (как пример Алана), если вам нужно уведомление об изменении! также будет работать привязка к классу POCO Settings!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...