9

我写了简单的代码

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}"

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

4

3 回答 3

11

如果您只指定绑定路径,绑定引擎将尝试从当前路径开始导航,DataContext因此ItemsSource="{Binding Path=Names}"不会像这样工作,有很多不同的事情需要记住,尤其是在做更复杂的事情时。

每个 DataBinding 新手都应该阅读的最重要的一篇文章是MSDN 上的 Data Binding Overview

要回到您的绑定,如果您想完全在 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 - 设置数据上下文

<Window ...
        DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">
    <Grid> 
            <ListBox ...
                     ItemsSource="{Binding Path=Names}"
                     .../>
    </Grid>
</Window>
于 2011-04-01T18:33:59.107 回答
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 设计将数据与后面的代码隔离开来。

于 2010-09-02T07:20:58.307 回答
5

看来你Names可能是一个领域。您只能绑定到公共属性

于 2015-11-18T10:03:22.887 回答