【问题标题】:Binding combobox selected value to an application setting将组合框选定值绑定到应用程序设置
【发布时间】:2012-11-29 19:00:04
【问题描述】:

像这样映射应用程序属性:

<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>

这个问题是它只在一个方向上起作用,从设置到组合框,但组合中的任何选择都不会回到设置。 当我在模型中使用常规属性作为字体大小时,一切似乎都正常......

关于如何使绑定以双向方式工作的任何建议?

【问题讨论】:

  • 这篇文章是指使用 ListBox...我的问题是关于组合框...我可以成功地使 TextBox 与设置一起工作,但不是 ComboBox...感谢您查找它。跨度>
  • 是的,在阅读了您的答案后,我没有意识到它是特定于控制的。
  • 创建一个新的设置实例来访问你真正想要的实例的静态属性似乎是个坏主意,我建议使用以下形式的绑定:{Binding &lt;PropertyName&gt;, Source={x:Static properties:Settings.Default}}
  • 这只是表达相同意图的另一种方式......我也遇到了 msdn 论坛上报告的组合框的类似问题,声称这是 .net 4.5 中的错误。 (对不起,没有保存链接)我打算使用组合框的方式应该没有任何问题。但是,它只是不能像其他控件那样工作。

标签: wpf data-binding properties combobox application-settings


【解决方案1】:

它看起来是 .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);
    }

【讨论】:

    【解决方案2】:

    您是否尝试将绑定的模式设置为双向?

    <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">
    

    【讨论】:

    【解决方案3】:

    找到了这个解决方法:

    <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;
        }
    }
    

    丑陋,但有效...希望提出更好的解决方案...

    这篇文章提供了对该问题的更多见解:LINK

    它在 .NET4.5 中的工作方式与以前的版本不同。

    【讨论】:

    • 链接应该和这个无关,你不要绑定到静态属性。
    • Source={StaticResource Settings}
    • 那不是a属性它是源对象,StaticResource也和what is usually meant by static无关。
    猜你喜欢
    • 2013-03-18
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多