【发布时间】: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