双向将组合框绑定到简单的字符串数组

时间:2010-09-16 17:29:29

标签: silverlight data-binding

我有一个简单的类,提供如下的状态代码:

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绑定适用于除组合框之外的所有内容。

3 个答案:

答案 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