WPF ComboBox:将ItemsSource绑定到List和双向将选定的值绑定到ViewModel属性?

时间:2013-09-09 14:02:19

标签: wpf xaml data-binding mvvm combobox

这是我第一次使用这种性质的WPF绑定,所以我确定我做的很傻。

背景/设置

我有以下内容:

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

目标

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

问题

绑定似乎无声地失败。我看到组合框项目,但是当我选择它们时,没有任何变化,并且看起来没有调用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));
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

最后,您需要在需要更新时随时随地拨打OnPropertyChanged("SqlServerHasBeenEntered");。 (此可以从另一个相关的属性设置器中调用,该设置器在某个时间更新,或者只是从任何方法更新。