Привязка выбранного значения поля со списком к настройке приложения

Сопоставление свойств приложения следующим образом:

<Application.Resources>
    <properties:Settings x:Key="Settings" />
</Application.Resources>

Цель состоит в том, чтобы привязать параметр размера шрифта MainWindowFontSize (int) к выбранному значению в поле со списком:

<ComboBox 
  SelectedValuePath="Content"
  SelectedValue="{Binding Default.MainWindowFontSize, Source={StaticResource Settings}}">
<ComboBoxItem>8</ComboBoxItem>
...
<ComboBoxItem>48</ComboBoxItem>
</ComboBox>

Проблема в том, что он работает только в одном направлении, из настройки в ComboBox, но любой выбор в комбо не возвращается к настройке. Кажется, все работает нормально, когда я использую обычное свойство для размера шрифта в модели...

Любые предложения о том, как заставить привязку работать с настройкой в ​​обоих направлениях?


person Califf    schedule 29.11.2012    source источник
comment
Вы взглянули на это? weblogs.asp.net/thomaslebrun/archive/2009/03/26/   -  person d.moncada    schedule 29.11.2012
comment
В статье говорится об использовании ListBox... Мой вопрос был о поле со списком... Я могу успешно заставить TextBox работать с настройками, но не со списком ComboBox... Спасибо за поиск.   -  person Califf    schedule 29.11.2012
comment
Да, прочитав ваш пост с ответом, я не понял, что это конкретное управление.   -  person d.moncada    schedule 30.11.2012
comment
Создание нового экземпляра настроек для доступа к статическому свойству с экземпляром, который вам действительно нужен, кажется плохой идеей, я бы рекомендовал привязки в форме: {Binding <PropertyName>, Source={x:Static properties:Settings.Default}}   -  person H.B.    schedule 30.11.2012
comment
это просто другой способ выразить одно и то же намерение ... Я также столкнулся с аналогичной проблемой с выпадающим списком, о которой сообщалось на форумах msdn, утверждая, что это ошибка в .net 4.5. (извините, не сохранил ссылку) Не должно быть никаких проблем с тем, как я намеревался использовать Combobox. Однако он просто не работает, как другие элементы управления.   -  person Califf    schedule 01.12.2012


Ответы (3)


Похоже, это что-то новое в .NET 4.5. Однако я обнаружил, что если вы создаете привязку в коде, он работает нормально. Вот так:

    public MainWindow()
    {
        InitializeComponent();
        var binding = new Binding("Delay");
        binding.Source = Settings.Default;
        binding.Mode = BindingMode.TwoWay;
        BindingOperations.SetBinding(this.Combo, ComboBox.SelectedValueProperty, binding);
    }
person Maksim Libenson    schedule 01.12.2012

Вы пытались установить режим привязки на TwoWay?

<ComboBox 
  SelectedValuePath="Content"
  SelectedValue="{Binding Default.MainWindowFontSize, Source={StaticResource Settings}, Mode=TwoWay}">

Вы также можете попробовать UpdateSourceTrigger:

 <ComboBox 
  SelectedValuePath="Content"
  SelectedValue="{Binding Default.MainWindowFontSize, Source={StaticResource Settings}, Mode=TwoWay}, UpdateSourceTrigger=PropertyChanged">
person Arthur Nunes    schedule 29.11.2012
comment
да, без разницы... Также я думаю, что это значение по умолчанию для режима - person Califf; 29.11.2012
comment
Тогда, может быть, UpdateSourceTrigger. См. stackoverflow.com/questions/1187294/ и stackoverflow.com/questions/4770912/ - person Arthur Nunes; 29.11.2012
comment
К сожалению, UpdateSourceTrigger=PropertyChanged тоже не помог... Хотя это прекрасно работает: ‹TextBox Text={Binding Default.MainWindowFontSize, Source={StaticResource Settings}, Mode=TwoWay} ›‹/TextBox› Очевидно, проблема с выпадающим списком... - person Califf; 29.11.2012
comment
TwoWay используется по умолчанию, см. раздел сведений о свойствах зависимостей в документы. - person H.B.; 30.11.2012

Нашел этот обходной путь:

<ComboBox ...  SelectionChanged="MainWndFontSizeSelectionChanged" ...>

Обработчик события:

private void MainWndFontSizeSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var cb = (ComboBox)sender;
    int newSize = 0;
    if (Int32.TryParse(cb.SelectedValue.ToString(), out newSize) == true)
    {
        WpfApplication1.Properties.Settings.Default.MainWindowFontSize = newSize;
    }
}

Уродливо, но работает... Надеясь найти лучшее решение...

Этот пост дает больше информации о проблеме, как она появляется:ССЫЛКА< /а>

В .NET4.5 это работает не так, как в предыдущих версиях.

person Califf    schedule 29.11.2012