Подтвердить что ты не робот

Лучший способ привязать свойства WPF к ApplicationSettings в С#?

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

4b9b3361

Ответ 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 также будет работать!