为什么这个ComboBox数据绑定不起作用?

时间:2013-10-20 07:59:24

标签: c# wpf xaml combobox

我有一个小测试窗口,如下所示:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ComboBox x:Name="Combo" DisplayMemberPath="Word" ItemsSource="{Binding Numbers}" HorizontalAlignment="Left" Margin="115,27,0,0" VerticalAlignment="Top" Width="120" />
    </Grid>
</Window>

使用代码隐藏:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Numbers = new ObservableCollection<NumberWord>
                      {
                          new NumberWord {Number = 1, Word = "One"},
                          new NumberWord {Number = 2, Word = "Two"},
                          new NumberWord {Number = 3, Word = "Three"}
                      };
        Combo.ItemsSource = Numbers;
    }
    public ObservableCollection<NumberWord> Numbers { get; set; }
}

我一直在看到我的其他绑定问题的答案,这些问题说明Combo.ItemsSource = Numbers;的显式设置是不必要的,因为我有绑定ItemsSource="{Binding Numbers}"。我也多次被告知我不需要在DataContext上设置Combo,因为整个窗口是数据上下文,Combo继承了这个数据上下文。

我的问题是,为什么我总是 - 不只是这个组合 - 在代码背后明确设置ItemsSource或其他绑定属性。为什么XAML数据绑定不起作用?

3 个答案:

答案 0 :(得分:2)

绑定ItemsSource="{Binding Numbers}"需要一个源对象,即具有公共Numbers属性的源对象。在您的情况下,这是MainWindow实例。

因此要么通过以下方式明确设置源:

ItemsSource="{Binding Numbers,
    RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"

或者您可以通过设置DataContext来设置源对象,例如代码背后:

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
    ...
}

如果您以后需要更改Numbers属性的值,还必须添加属性更改通知机制,例如实现INotifyPropertyChanged接口。


在MSDN上的Data Binding Overview文章中对此进行了详细解释。

答案 1 :(得分:1)

如果未设置本地值,则

DataContext是子控件从Parent继承的DependancyProperties之一。

因此,如果您将DataContext Window设置为某个内容,那么包含ComboBox在内的子控件就会拥有它。

现在,在您的情况下,您尚未设置DataContext的{​​{1}},因此Window的{​​{1}}无法正常工作

如果在窗口的构造函数中,则在initializeComponent之后执行

Binding

然后您无需在ItemsSource中设置DataContext = this; 的{​​{1}},ItemsSource的约束将对您的组合有效。

答案 2 :(得分:0)

您需要实现INotifyPropertyChanged。然后使用:

this.DataContext = this;