这甚至可能吗?我有两个 ObservableCollections。我想用其中一个绑定并填充一个列表框。例如,假设我们有 2 个按钮 - 一个用于 Twitter,一个用于 Facebook。单击 Facebook 按钮,它将使用来自 facebook 可观察集合的朋友姓名填充列表框,并将其绑定。单击 Twitter 它将用 Twitter 关注者填充列表框并填充列表框并绑定它。
如何选择将在列表框中填充哪个集合?
这甚至可能吗?我有两个 ObservableCollections。我想用其中一个绑定并填充一个列表框。例如,假设我们有 2 个按钮 - 一个用于 Twitter,一个用于 Facebook。单击 Facebook 按钮,它将使用来自 facebook 可观察集合的朋友姓名填充列表框,并将其绑定。单击 Twitter 它将用 Twitter 关注者填充列表框并填充列表框并绑定它。
如何选择将在列表框中填充哪个集合?
我只会使用一个可观察的集合并根据用户的选择进行填充。你也可以用两个来源的名字填充它,并有一个过滤器来过滤掉一个或另一个(显然你需要一个包装器对象,你可以在其中指出这个名字是 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
的 type ,它也将起作用object
。但是考虑到它们是由同一个应用程序在同一个列表框中显示的,这表明您可以找到某种通用基础,并且可以创建通用接口或基类。
实现这一点的一种不优雅的方法是将 2 个列表框放在同一位置,并将 1 个绑定到 twitter 集合,另一个绑定到 facebook 集合。将它们的可见性绑定到基于按钮单击而更改的属性。就个人而言,我有 2 个单选按钮,并根据选择的单选按钮显示列表框。
<ListBox Grid.Row="0" Grid.Column="0" ItemsSource="{Binding Path=TwitterCollection}" SelectedItem="{Binding Path=SelectedTwitterItem}" Visibility="{Binding Path=IsTwitterSelected, Converter={StaticResource visibilityConverter}}" />
<ListBox Grid.Row="0" Grid.Column="0" ItemsSource="{Binding Path=FacebookCollection}" SelectedItem="{Binding Path=SelectedFacebookItem}" Visibility="{Binding Path=IsFacebookSelected, Converter={StaticResource visibilityConverter}}" />
<RadioButton Grid.Row="1" Grid.Column="0" GroupName="rdoOptions" Content="{Binding Path=TwitterLabel}" IsChecked="{Binding Path=IsTwitterSelected}" />
<RadioButton Grid.Row="1" Grid.Column="1" GroupName="rdoOptions" Content="{Binding Path=FacebookLabel}" IsChecked="{Binding Path=IsFacebookSelected}" />
在您的 ViewModel 中,创建一个公开一个或另一个 ObservableCollection 的属性,并在单击按钮时将其换出:
private ObservableCollection<string> _twitterFriendList;
private ObservableCollection<string> _facebookFriendList;
private ObservableCollection<string> _selectedFriendList;
public ObservableCollection<string> SelectedFriendList
{
get { return _selectedFriendList; }
set
{
if (value != _selectedFriendList)
{
_selectedFriendList = value;
RaisePropertyChanged("SelectedFriendList");
}
}
}
void TwitterButton_Click(object sender, RoutedEventArgs e)
{
SelectedFriendList = _twitterFriendList;
}
void FacebookButton_Click(object sender, RoutedEventArgs e)
{
SelectedFriendList = _facebookFriendList;
}
然后在您的 XAML 中,您可以绑定到该属性:
<ListBox ItemsSource="{Binding SelectedFriendList}"/>