0

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

背景/设置

我有以下内容:

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

目标

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

问题

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

到目前为止的代码

组合框 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));
    }
}
4

1 回答 1

0

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

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

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

于 2013-09-09T14:18:57.383 回答