【问题标题】:WPF ComboBox: Bind ItemsSource to List and Two-way Bind selected value to ViewModel Property?WPF ComboBox:将 ItemsSource 绑定到列表和双向将选定值绑定到 ViewModel 属性?
【发布时间】:2013-09-13 01:10:58
【问题描述】:

这是我第一次使用这种性质的 WPF 绑定,所以我确信我在做一些愚蠢的事情。

背景/设置

我有以下几点:

  • ViewModel (MainWindowViewModel)
  • 绑定的数据上下文
    • Window 定义中,DataContext="{StaticResource MainWindowViewModel}"
  • 在视图模型中,一个列表:
    • readonly List<string> _sqlServerChoices = new List<string>{"DEV", "SPDEV", "SPSQL", "SQL2008"};
  • 显示列表的视图模型属性:
    • public List<string> SqlServerChoices{get { return _sqlServerChoices; }}
  • ComboBox 用于选择 SQL Server
  • 一个名为“Settings”的属性,它是一种自定义类型,UploaderSettings,它包含数据库设置、共享点设置等的集合。
  • 一个名为SqlServerHasBeenEntered的属性,它是一个布尔值,返回是否
  • 一个文本框,应该根据 SQL 是否启用或禁用

目标

  • 我希望将组合框中的项目(ItemsSource)选项设置为 SQL Server 列表。这似乎工作正常。
  • 我希望列表中的选定元素能够双向绑定到 ViewModel 上的 Settings.DatabaseSettings.SqlServer 属性。
  • 更新此属性后,我想为 SqlServerHasBeenEntered 属性触发 OnPropertyChanged。
  • 我想根据 SqlServerHasBeenEntered 属性是真还是假来启用或禁用文本框。

问题

绑定似乎静默失败。我看到组合框项目,但是当我选择它们时,没有任何变化,并且似乎没有调用 onpropertychanged 事件处理程序。

到目前为止的代码

ComboBox XAML 定义:

<ComboBox Grid.Row="0" Grid.Column="1" VerticalAlignment="Center" 
                          ItemsSource="{Binding SqlServerChoices}" 
                          SelectedValue="{Binding Settings.DatabaseSettings.SqlServer, 
                                Mode=TwoWay, 
                                UpdateSourceTrigger=PropertyChanged }">

SQL Server 字段是否有文本的布尔值:

public bool SqlServerHasBeenEntered
{
    get
    {
        return !String.IsNullOrEmpty(Settings.DatabaseSettings.SqlServer);
    }
}

属性更改处理程序:

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

【问题讨论】:

  • 您是否将断点放在 Settings.DatabaseSettings.SqlServer 的设置器中,并在您选择组合中的值时查看它是否命中?我也假设 Settings.DatabaseSettings.SqlServer 不是自动属性?

标签: wpf xaml data-binding mvvm combobox


【解决方案1】:

首先,使用ComboBox.SelectedItem 属性绑定到您的Settings.DatabaseSettings.SqlServer 属性(而不是SelectedValue)。然后添加IsEnabled属性绑定:

<ComboBox IsEnabled="{Binding SqlServerHasBeenEntered}" ... />

最后,当您希望更新时,您需要随时随地致电OnPropertyChanged("SqlServerHasBeenEntered");。 (这个可以从另一个在特定时间更新的相关属性设置器调用,或者只是从任何方法调用)。

【讨论】:

  • 对不起,我应该澄清一下:我有另一个文本框,其 IsEnabled 属性以您提到的方式绑定。似乎没有发生的是该属性似乎没有随着组合框的变化而更新。
  • 您现在使用过ComboBox.SelectedItem 属性吗? Settings.DatabaseSettings.SqlServer 的类型是否与ComboBox.ItemsSource 属性的类型相同?它有 getter 和 setter 吗?
猜你喜欢
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 2015-04-07
  • 2011-06-25
  • 1970-01-01
  • 2018-08-02
  • 2017-01-05
  • 2011-02-01
相关资源
最近更新 更多