我写了像
这样的简单代码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}"
不幸的是,它不起作用。你能解释一下为什么以及如何做到这一点吗?
答案 0 :(得分:9)
如果您只指定绑定路径,绑定引擎将尝试从当前DataContext
开始导航路径,因此ItemsSource="{Binding Path=Names}"
不能像这样工作,有很多不同的东西需要保留特别注意做更复杂的事情。
DataBinding新手应该阅读的最重要的一篇文章是Data Binding Overview on MSDN
要回到你的绑定,如果你想在XAML中完全完成它你也可以这样做,你只需要以某种方式使Window成为你的源,可以直接或相对地引用它或者将它设置为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 - 设置DataContext
<Window ...
DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">
<Grid>
<ListBox ...
ItemsSource="{Binding Path=Names}"
.../>
</Grid>
</Window>
答案 1 :(得分:5)
在
背后的代码中执行此操作public Window1()
{
PutInDataIntoNames();
InitializeComponent();
DataContext = this;
}
和XAML
<Grid>
<ListBox ItemsSource="{Binding Names}"
Margin="10,11,10,16"
Name="listBox1"
Background="Black"
Foreground="Orange"
/>
</Grid>
理想情况下,您应该遵循MVVM设计,将数据与后面的代码隔离开来。
答案 2 :(得分:4)
您的Names
似乎可能是一个字段。您只能绑定到公共属性