0

我想在后面的代码中将一个列表框绑定到一个可观察的集合。这就是我用于绑定的内容:

Binding binding = new Binding();
binding.Source = symTable;
substanceList.SetBinding(ListBox.ItemsSourceProperty, binding);

symTable继承自ObservableCollection, Count 属性得到适当更新,所以我知道我正在正确添加元素,但列表框不是。我不知道将路径设置为什么,因为在 XAML 中它绑定到整个列表。

注意:将单个项目添加到 ListBox 时,它们会显示出来,因此这不是显示问题。我也试过:

this.Resources.Add("symTable", symTable);

在窗口构造函数中,然后是:

但它说资源无法解决。

我还尝试将它添加为 XAML 中的资源,但它不再起作用://在窗口的资源中。

<s:SymbolTable x:Key="symTable"/> 
...
<ListBox x:Name="substanceList" ItemsSource="{Binding Source={StaticResource symTable}}"/>

然后在后面的代码中:

symTable = (SymbolTable)this.FindResource("symTable");

有谁知道在代码后面或 XAML 中执行此操作的任何其他方式,我认为ElementName指的是在代码后面定义的对象。

这是 symTable 类定义的一部分:

public class SymbolTable : ObservableCollection<Substance>
{
    Dictionary<string, Substance> symbolTable;
    ...
    public Substance Insert(Substance s)
    {

        if (!symbolTable.ContainsKey(s.Name))
        {
            symbolTable.Add(s.Name, s);
            Items.Add(s);
        }

        return symbolTable[s.Name];
    }

请注意,所以我只是注意到最奇怪的事情,Items.Add 没有引发 INotifyChanged 事件。我在我的 Insert 方法中使用了 Items.Add,我猜 Items.Add 没有引发 INotifyChanged 事件,因此 ListBox 没有得到更新,但是什么时候 Add 而不是 Items.Add 然后它起作用了。你知道这是否真的是这样吗?

4

3 回答 3

1

好的,根据您对问题的评论,这里是如何在 XAML 中将 SymbolTable 声明为资源以及如何将 ListBox 绑定到它。请注意 XAML 命名空间声明“local”,它指的是ListBindingTest在我的测试项目中命名的本地命名空间/程序集。

<Window x:Class="ListBindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ListBindingTest"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:SymbolTable x:Key="symTable"/>
    </Window.Resources>
    <Grid>
        <ListBox ItemsSource="{Binding Source={StaticResource symTable}}"/>
    </Grid>
</Window>

您可以在窗口类后面的代码中访问 SymbolTable 资源,如下所示:

SymbolTable st = (SymbolTable)Resources["symTable"];
st.Add(new Substance());
于 2012-01-27T23:52:31.843 回答
0

DisplayMemberPath 需要是 symTable 的公共属性。

于 2012-01-27T22:21:23.890 回答
0

您总是可以直接在列表框上设置 ItemSource。

substanceList.ItemsSource = symTable;
于 2012-01-27T22:47:22.153 回答