我有一个简单的类,提供如下的状态代码:
public class StateProvider
{
static string[] _codes = new string[]
{
"AL",
"AK",
...
};
public string[] GetAll()
{
return _codes;
}
}
我支持视图的模型类看起来有点像这样:
public class ProjectModel : ChangeNotifier
{
StateProvider _states = new StateProvider();
public ProjectModel()
{
Project = LoadProject();
}
ProjectEntity _project;
public ProjectEntity Project
{
get { return _project; }
set
{
_project = value;
FirePropertyChanged("Project");
}
}
public string[] States { get { return _states.GetAll(); } }
}
我的ComboBox XAML看起来像这样:
<ComboBox SelectedValue="{Binding Project.State, Mode=TwoWay}" SelectedValuePath="{Binding RelativeSource={RelativeSource Self}}" ItemsSource="{Binding States}" />
绑定工作从UI到实体 - 如果我从组合中选择状态,那么值将被推送到项目实体,我可以保存它。但是,如果我关闭并重新加载,则状态代码值不会从实体绑定到UI,并且组合显示没有选择任何内容。然后,当然,后续保存会使实体的状态值为空。
我希望这很简单,因为我想显示状态代码并保存状态代码(我不想显示完整的州名)。因此,我不想创建具有Code和FullName属性的State类,并且不必使用组合框的SelectedValuePath和DisplayMemberPath属性。
编辑: 在代码中添加了ProjectModel如何更改通知。请注意,ProjectEntity类也执行此操作。相信我,它有效。我把它遗漏了,因为它还继承了一个通过反射改变通知的Entity基类。 TwoWay绑定适用于除组合框之外的所有内容。
答案 0 :(得分:1)
您必须至少在ProjectModel类上实现IPropertyNotifyChanged
public class ProjectModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
并实现如下的Project属性,以便绑定到1-way-1次以外的工作。
public ProjectEntity Project
{
get { return (ProjectEntity)GetValue(ProjectProperty); }
set { SetValue(ProjectProperty, value); }
}
// Using a DependencyProperty as the backing store for Project.
// This enables animation, styling, binding, etc...
public static readonly DependencyProperty ProjectProperty =
DependencyProperty.Register("Project",
typeof(ProjectEntity),
typeof(ProjectModel),
new PropertyMetadata(null,
new PropertyChangedCallback(OnProjectChanged)));
static void OnProjectChanged(object sender, DependencyPropertyChangedEventArgs args)
{
// If you need to handle changes
}
答案 1 :(得分:1)
<ComboBox ItemsSource="{Binding States}" SelectedValue="{Binding Project.State, Mode=TwoWay}" />
事实证明,这是我将属性放在XAML中的顺序。 SelectedValue绑定发生在ItemsSource绑定之前,因此在绑定SelectedValue时组合框中没有项目。
哇,这看起来真的很糟糕。答案 2 :(得分:0)
将ProjectModel类更改为:
public class ProjectModel : ChangeNotifier
{
StateProvider _states = new StateProvider();
public ProjectModel()
{
Project = LoadProject();
States = new ObservableCollection<string>(_states.GetAll());
}
ProjectEntity _project;
public ProjectEntity Project
{
get { return _project; }
set
{
_project = value;
FirePropertyChanged("Project");
}
}
public ObservableCollection<string> States { get; set; }
}
另请确保ProjectEntity
也实施INotifyPropertyChanged
。