我只会使用一个可观察的集合并根据用户的选择进行填充。你也可以用两个来源的名字来填充它,并有一个过滤器来过滤掉一个或另一个(显然你需要一个包装器对象,你可以在其中指明这个名字是 Facebook 朋友还是 twitter 关注者)。
编辑:下面是一些快速的代码示例,说明如何做到这一点:
public interface ISocialContact
{
string Name { get; }
}
public class FacebookContact : ISocialContact
{
public string Name { get; set; }
public string FacebookPage { get; set; }
}
public class TwitterContact : ISocialContact
{
public string Name { get; set; }
public string TwitterAccount { get; set; }
}
然后在您的数据上下文中:
public ObservableCollection<ISocialContact> Contacts { get; set; }
...
Contacts = new ObservableCollection<ISocialContact> {
new FacebookContact { Name = "Face", FacebookPage = "book" },
new TwitterContact { Name = "Twit", TwitterAccount = "ter" }
};
在你的 xaml 中:
<Grid>
<Grid.Resources>
<DataTemplate DataType="{x:Type local:FacebookContact}">
<TextBlock Text="{Binding FacebookPage}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:TwitterContact}">
<TextBlock Text="{Binding TwitterAccount}"/>
</DataTemplate>
</Grid.Resources>
<ListBox ItemsSource="{Binding Contacts}" Width="100" Height="100"/>
</Grid>
这会将适当的模板应用于您集合中的每个对象。因此,您可以仅使用 facebook 联系人或仅使用 twitter 联系人或混合进行收藏。
另请注意:您不需要通用接口。如果您只是将ObservableCollection 设为object 类型,它也将起作用。但是鉴于它们是由同一个应用程序在同一个列表框中显示的,这表明您可以找到某种通用基础,并且可以创建通用接口或基类。