ListBox.ItemsSource绑定代码和xaml

时间:2010-09-02 07:06:12

标签: wpf listbox itemssource

我写了像

这样的简单代码
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}"

不幸的是,它不起作用。你能解释一下为什么以及如何做到这一点吗?

3 个答案:

答案 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似乎可能是一个字段。您只能绑定到公共属性