将ObservableCollection数据绑定到ListBox

时间:2014-08-05 19:43:42

标签: c# wpf data-binding listbox observablecollection

我一直试图找出将类的ObservableCollection绑定到带有TextBox DataTemplate的ListBox的正确方法。我试图在WPF binding: Set Listbox Item text color based on property中实现代码,但是到目前为止还没有让我走得太远。我是WPF DataBinding的新手,在最简单的情况下,最多以编程方式设置ItemsSource。

我有这个班级

public class item
{
    public string guid;
    public bool found;
    public bool newItem;
    public Brush color;
}

和以下ObservableCollection

public ObservableCollection<item> _items;

public Window()
{
    InitializeComponent();
    _items = new ObservableCollection<item>();
}

在代码的其他地方,我通过

将项目添加到集合中
_items.Add(new item() { guid = sdr.GetString(0), found = false, newItem = false, color = Brushes.Red });

这是ListBox的简化XAML

<ListBox x:Name="ListBox_Items">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text=GUID_HERE Foreground=COLOR_HERE/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我已经尝试了几种不同的方法来使其正常工作,但是对于它们都没有,ListBox正在更新。有人能帮我指出正确的方向吗?

2 个答案:

答案 0 :(得分:0)

我认为您忘了将ListBox绑定到集合本身。

您的XAML应如下所示:

<ListBox x:Name="ListBox_Items" ItemsSource="{Binding _items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text=GUID_HERE Foreground=COLOR_HERE/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

如果您想要更改集合中项目的属性(并且更改显示在UI上),您应该在&#34; item&#34;中实现INotifyPropertyChanged(请参阅MSDN)界面中的更多内容。类。

答案 1 :(得分:0)

四件事:

您的item类需要使用公共属性:

public class item
{
    public string guid { get; set; }
    public bool found { get; set; }
    public bool newItem { get; set; }
    public Brush color { get; set; }
}

您需要将ItemsSource设置为集合,并设置当前DataContext

public Window()
{
    InitializeComponent();
    DataContext = this;

    _items = new ObservableCollection<item>();
    ListBox_Items.ItemsSource = _items;     
}

您需要更新DataTemplate以使用POCO的属性名称

<ListBox x:Name="ListBox_Items">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding guid}" Foreground="{Binding color}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>