这是我第一次使用这种性质的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 回答
首先,使用
ComboBox.SelectedItem
属性绑定到Settings.DatabaseSettings.SqlServer
属性(而不是SelectedValue
) . 然后添加IsEnabled
属性绑定:最后,您需要在需要更新时随时随地调用
OnPropertyChanged("SqlServerHasBeenEntered");
. (这可以从另一个相关的属性设置器调用,该设置器在某个时间更新,或者仅从任何方法更新) .