这是我第一次使用这种性质的 WPF 绑定,所以我确信我在做一些愚蠢的事情。
背景/设置
我有以下内容:
- 视图模型 (MainWindowViewModel)
- 绑定的数据上下文
- 在
Window
定义中,DataContext="{StaticResource MainWindowViewModel}"
- 在
- 在视图模型中,一个列表:
readonly List<string> _sqlServerChoices = new List<string>{"DEV", "SPDEV", "SPSQL", "SQL2008"};
- 暴露列表的视图模型属性:
public List<string> SqlServerChoices{get { return _sqlServerChoices; }}
- A
ComboBox
用于选择 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));
}
}