我写了简单的代码
public ObservableCollection<string> Names …
public Window1()
{
PutInDataIntoNames();
InitializeComponent();
this.listBox1.ItemsSource = Names;
}
并在 xaml
<Grid>
<ListBox Margin="10,11,10,16"
Name="listBox1"
Background="Black"
Foreground="Orange"
/>
</Grid>
然后我想在 xaml 中设置 ItemsSource 属性。为了做到这一点,我写了以下内容:
ItemsSource="{Binding Path=Names}"
不幸的是,它不起作用。你能解释一下为什么以及如何做到这一点吗?
最佳答案
如果您只指定绑定(bind)路径,绑定(bind)引擎将尝试从当前 DataContext
开始导航路径。所以ItemsSource="{Binding Path=Names}"
不是这样工作的,有很多不同的事情要记住,尤其是在做更复杂的事情时。
每个 DataBinding 新手都应该阅读的最重要的一篇文章是 Data Binding Overview on MSDN
回到你的绑定(bind),如果你想完全在 XAML 中完成它,你也可以这样做,你只需要以某种方式使窗口成为你的源,或者直接或相对引用它,或者将它设置为 DataContext。
1 - 直接引用:
<Window Name="Window"
...>
<Grid>
<ListBox ...
ItemsSource="{Binding ElementName=Window, Path=Names}"
.../>
</Grid>
</Window>
2 - 相对引用
<Grid>
<ListBox ...
ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Names}"
.../>
</Grid>
3 - 设置数据上下文
<Window ...
DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">
<Grid>
<ListBox ...
ItemsSource="{Binding Path=Names}"
.../>
</Grid>
</Window>
关于wpf - 代码和 xaml 中的 ListBox.ItemsSource 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3624496/