我有一个小测试窗口,如下所示:
<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数据绑定不起作用?
答案 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;