使用ComboBox的数据绑定ObservableCollection <t>不适用于依赖项属性

时间:2017-02-13 21:21:58

标签: c# wpf data-binding combobox dependency-properties

我有一个对象列表(ObservableCollection subjectlist),并希望通过数据绑定和依赖属性在Combobox中显示它们。

WPF Data Binding to a Combo Box

我在stackoverflow上搜索并试图在上面的链接中实现Craig Suchanec的解决方案。 (现在尝试了一整天,我只是不知道我的代码有什么问题)

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public static readonly DependencyProperty SubjectListProperty =
        DependencyProperty.Register("SubjectList",
        typeof(ObservableCollection<Subject>),
        typeof(MainWindow));



    private ObservableCollection<Subject> subjectList = new ObservableCollection<Subject>();
    Initialization init1;


    public ObservableCollection<Subject> SubjectList
    {
        get { return (ObservableCollection<Subject>)GetValue(SubjectListProperty); }
        // get { return subjectList; }

    }


    public MainWindow()
    {
        init1 = new Initialization();
        subjectList = init1.createMenuSubject();

        InitializeComponent();
        //this.comboBox.DataContext = SubjectList;
    }
}

MainWindow.xaml

   <Grid>

    <ComboBox x:Name="comboBox"  HorizontalAlignment="Left"VerticalAlignment="Top" Width="120" Margin="321,10,0,0"
                          ItemsSource="{Binding ElementName=mainWindow, Path=SubjectList}" DisplayMemberPath="Name"/>

   </Grid>

如果我只设置DataContext并且没有依赖属性工作,那么它可以正常工作,但是一旦我尝试使用依赖属性进行数据绑定它就没有了,我没有看到我的实现和链接中给出的解决方案。

如果有人能帮我解决这个问题,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

我无法在代码中的任何位置看到您实际设置SubjectList属性的值。

但是您设置了subjectList的值,但是您要绑定到SubjectList。注意套管差异。

答案 1 :(得分:0)

你应该写:

    public ObservableCollection<Subject> SubjectList
    {
        set { base.SetValue(SubjectListProperty, value); }
        get { return (ObservableCollection<Subject>)base.GetValue(SubjectListProperty); }
    }

而不是

    public ObservableCollection<Subject> SubjectList
    {
        set { base.SetValue(SubjectListProperty, value); }
        get { return subjectList; }
    }

或任何其他ad hoc格式。您正在构造函数 MainWindow()中设置 subjectList ,但是,它不会设置 SubjectList (使用Capital S)和属性的值永远不会提出改变事件。删除 subjectList

如果您想知道为什么 DataContext 方法有效,您应该注意即使您不使用 DepenedencyProperty 它也能正常工作。但是,如果您实现 INotifyPropertyChange ,它也可以设置 ElementName