我有一个提供如下状态代码的简单类:
public class StateProvider
{
static string[] _codes = new string[]
{
"AL",
"AK",
...
};
public string[] GetAll()
{
return _codes;
}
}
我支持 View 的模型类看起来有点像这样:
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 到实体的绑定(bind)工作 - 如果我从组合中选择状态,那么值将被推送到项目实体,我可以保存它。但是,如果我关闭并重新加载,状态代码值不会从实体绑定(bind)到 UI,并且组合显示未选择任何内容。然后,当然,随后的保存会使实体的状态值为空。
我希望这非常简单,因为我想显示州代码并保存州代码(我不想显示完整的州名称)。因此,我不想费心创建一个具有 Code 和 FullName 属性的 State 类,并避免使用组合框的 SelectedValuePath 和 DisplayMemberPath 属性。
编辑: 添加到代码中 ProjectModel 如何进行更改通知。请注意,ProjectEntity 类也执行此操作。相信我,它有效。我将其排除在外是因为它还继承自通过反射进行更改通知的 Entity 基类。 TwoWay 绑定(bind)适用于组合框以外的所有内容。
最佳答案
您至少必须在您的 ProjectModel 类上实现 IPropertyNotifyChanged
public class ProjectModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
并实现如下所示的 Project 属性以绑定(bind)到 1-way-1-time 以外的工作。
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
}
关于silverlight - 双向将组合框绑定(bind)到简单的字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3729146/