我正在使用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
个对象后,我将其绑定到Online
当ContactModel
的属性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
属性设置了更改,然后从GroupedContacts
到LongListSelector
答案 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
课程,以确保对布局的更改将是“实时”。