首页 文章

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

提问于
浏览
0

这是我第一次使用这种性质的WPF绑定,因此我确信我正在做一些愚蠢的事情 .

背景/设置

我有以下内容:

  • ViewModel(MainWindowViewModel)

  • 绑定的Datacontext
    Window 定义中的

  • DataContext="{StaticResource MainWindowViewModel}"

  • 在viewmodel中,列表:

  • readonly List<string> _sqlServerChoices = new List<string>{"DEV", "SPDEV", "SPSQL", "SQL2008"};

  • 公开列表的viewmodel属性:

  • public List<string> SqlServerChoices{get { return _sqlServerChoices; }}

  • A ComboBox 用于选择SQL Server

  • 一个名为"Settings"的属性,它是一个自定义类型, UploaderSettings ,具有数据库设置,共享点设置等的集合 .

  • 一个名为 SqlServerHasBeenEntered 的属性,它是一个返回是否为boolean的布尔值

  • 应根据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

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

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

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

相关问题