wpf - 代码和 xaml 中的 ListBox.ItemsSource 绑定(bind)

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

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

最佳答案

如果您只指定绑定(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/

相关文章:

c# - 显示 ItemsControl.ItemsSource 是否为 null

c# - 在列表框中扩展所选项目的高度

c# - WPF ObservableCollection CollectionView.CurrentChanged 未触发

wpf - WPF 中的自定义控件

c# - 绑定(bind)仅适用于第一个 TabItem

asp.net - 如何将 ASP.NET 列表框边框从 3d 更改为 1px solid?

WPF ListBox 在使用 ICommand 删除后选择下一项

c# - 无法将 ObservableCollection 绑定(bind)到 DataGrid

c# - 选择行时出现 DataGrid 错误

c# - 处理非常低的动画帧率