PropertyChanged与TemplateSelector和LongListSelector问题中的对象列表

时间:2014-02-13 15:18:36

标签: c# wpf xaml mvvm windows-phone-8

我正在使用windows phone 8模式为MVVM编写聊天应用程序。我的问题是通知LongListSelector ObservableCollection项组正在发生变化的public ObservableCollection<Group<ContactModel>> GroupedContacts。 好的一步一步:

分组的联系人列表是一个对象

public class Group<T> : ObservableCollection<T> { public Group(string name, IEnumerable<T> items) { this.Key = name; foreach (T item in items) { this.Add(item); } } public string Key { get; set; } }

哪个小组是:

private void CreateGroups()
{
    var group = new Group<ContactModel>("Online", new ObservableCollection<ContactModel>());
    GroupedContacts.Add(group);
    group = new Group<ContactModel>("Offline", new ObservableCollection<ContactModel>());
    GroupedContacts.Add(group);
}

然后我在这个对象中添加了两种格式:

ContactModel

在向每个组添加一些LongListSelector个对象后,我将其绑定到OnlineContactModel的属性TemplateSelector正在更改时,我正在从一个组中移动该对象到另一个 - 这没有问题。问题是我的ContentTemplate未更改public class AvailabilityTemplateSelector : ContentControl { public DataTemplate OnlineTemplate { get; set; } public DataTemplate OfflineTemplate { get; set; } protected override void OnContentChanged(object oldContent, object newContent) { base.OnContentChanged(oldContent, newContent); var contact = newContent as ContactModel; if (contact.Online) { ContentTemplate = OnlineTemplate; } else { ContentTemplate = OfflineTemplate; } } }

TemplateSelector:

GroupedContacts

我认为这里的问题是我将对象从一个组移动到另一个组的位置。 ObservableCollection属性并不意味着该属性已更改。属性GroupedContacts中的Content执行此操作,但不是LongListSelector的{​​{1}}。任何想法如何从ObservableCollection“告诉”我的GroupedContacts属性设置了更改,然后从GroupedContactsLongListSelector

2 个答案:

答案 0 :(得分:0)

你的例子中有一些错误。

您的ContentControl了解您的模型。那是WPF中的禁区!

如果您想要收听内容更改,则不应编写自定义控件,而应使用DataTemplateSelector。

http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector(v=vs.110).aspx

答案 1 :(得分:0)

我做了Converter而不是TemplateSelector,此刻一切正常。我需要将INotifyPropertyChanged实施到我的ContactModel课程,以确保对布局的更改将是“实时”。