我有一个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解决方案或类似的东西。
答案 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”。来自绑定。