如何在XAML中绑定ObservableCollection的属性

时间:2014-02-03 13:35:54

标签: c# wpf xaml mvvm

我有一个ChatroomViewModel:

//ObservableObject implements INotifyPropertyChanged
public class ChatroomViewModel : ObservableObject
{
    private ObservableCollection<Chat> _chatCollection;
    public ObservableCollection<Chat> ChatCollection
    {
        get { return this._chatCollection;  }
        set
        {
            if (null != value)
            {
                this._chatCollection = value;
                OnPropertyChanged("ChatCollection");
            }
        }
    }
}

ChatroomView:

<ListBox Grid.Row="1" ItemsSource="{Binding ChatCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="Name: "/>
                <TextBlock Text="{Binding ChatCollection.Name}"/>
                <TextBlock Text="Created by: "/>
                <TextBlock Text="{Binding ChatCollection.CreatedBy}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这是ChatModel:

//ObservableDatabaseModel also implements INotifyPropertyChanged
public class Chat : ObservableDatabaseModel
{
    private string _name;
    public string Name 
    {
        get { return this._name; }
        set
        {
            this._name = value;
            base.OnPropertyChanged("Name");
        }
    }

    private string _createdBy;        
    public string CreatedBy 
    {
        get { return this._createdBy; }
        set
        {
            this._createdBy = value;
            base.OnPropertyChanged("CreatedBy");
        }
    }
}

绑定有效,但它只显示对象的位置,而不是指定的Name / Createdby属性文本。

我不知道为什么这不起作用,我使用ObservableCollection<Chat>而不是List<Chat>因为它也可以绑定它的属性,我还将INotifyPropertyChanged实现为“子类”:Chat

我没有使用任何额外的MVVM框架,因此我无法使用MVVM-light解决方案或类似的东西。

2 个答案:

答案 0 :(得分:3)

DataContext内的ListBoxItem个UI元素已经是Chat类的实例。

WPF会自动将DataContext及其所有内容的ListBoxItem分配给数据项的相应实例。

因此你的绑定应该是这样的:

<TextBlock Text="Name: "/>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="Created by: "/>
<TextBlock Text="{Binding CreatedBy}"/>

答案 1 :(得分:2)

数据模板中的数据上下文是一个项目。

试试这个:

<ListBox Grid.Row="1" ItemsSource="{Binding ChatCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="Name: "/>
                <TextBlock Text="{Binding Name}"/>
                <TextBlock Text="Created by: "/>
                <TextBlock Text="{Binding CreatedBy}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</List

请注意,我删除了“ChatCollection”。来自绑定。