C# 如何选择要绑定到列表框的ObservableCollection?
这可能吗?我有两个明显的收集。我想用其中一个绑定并填充一个列表框。例如,假设我们有两个按钮——一个用于Twitter,一个用于Facebook。点击Facebook按钮,它将用Facebook observable collection中的好友姓名填充列表框,并将其绑定。点击Twitter,它将用Twitter追随者填充listbox,并填充listbox并绑定它C# 如何选择要绑定到列表框的ObservableCollection?,c#,wpf,binding,listbox,observablecollection,C#,Wpf,Binding,Listbox,Observablecollection,这可能吗?我有两个明显的收集。我想用其中一个绑定并填充一个列表框。例如,假设我们有两个按钮——一个用于Twitter,一个用于Facebook。点击Facebook按钮,它将用Facebook observable collection中的好友姓名填充列表框,并将其绑定。点击Twitter,它将用Twitter追随者填充listbox,并填充listbox并绑定它 如何选择在列表框中填充哪个集合 我只会根据用户的选择使用一个可观察的集合和填充。你也可以用这两个来源的名字来填充它,并用一个过滤器过
如何选择在列表框中填充哪个集合 我只会根据用户的选择使用一个可观察的集合和填充。你也可以用这两个来源的名字来填充它,并用一个过滤器过滤掉其中一个(显然你需要一个包装器对象,在这里你可以指明这个名字是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" }
};
publicobservableCollection联系人{get;set;}
...
Contacts=新的ObservableCollection{
新的facebook联系人{Name=“Face”,FacebookPage=“book”},
新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
,它也会起作用。但是,如果同一应用程序在同一列表框中显示它们,则表明您可以找到某种公共基,并且可以创建一个comon接口或基类。在您的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;
}
private observeCollection\u推特好友列表;
私人可观察收集(facebookFriendList);;
private ObservableCollection\u Selected Friendlist;
公共可观察集合选定的好友列表
{
获取{return\u selectedFriendList;}
设置
{
如果(值!=\u selectedFriendList)
{
_selectedFriendList=值;
RaisePropertyChanged(“SelectedFriendList”);
}
}
}
无效TwitterButton\u单击(对象发送者,路由目标)
{
SelectedFriendList=\u twitterFriendList;
}
作废FacebookButton_单击(对象发送器,路由EventTarget e)
{
SelectedFriendList=\u facebookFriendList;
}
然后,在XAML中,您可以只绑定到属性:
<ListBox ItemsSource="{Binding SelectedFriendList}"/>
实现这一点的一种非优雅方式是将两个列表框放在同一位置,并将其中一个绑定到twitter集合,另一个绑定到facebook集合。将其可见性绑定到根据按钮单击而更改的属性。就我个人而言,我有两个单选按钮,并根据其中一个显示列表框
<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}" />
我使用的Observable Collection如下:private Observable Collection\u twitterUser;在TwitterUserProfile中。obeservable集合中的对象是不同类型的。TwitterUserProfile具有我需要的所有属性。Facebook有不同的属性。我不熟悉wpf和binding等。如果这两个集合包含不同类型的数据,那么在相同的列表框中显示它们的最佳选择就是以某种方式统一它们。例如,创建一个Twitter和Facebook对象都可以实现的公共接口,并根据该接口进行绑定。下面是一个示例,详细解释了这个概念。但是可观察集合中的类型是不同的。我是新手,如果我错了,我很抱歉。Twitter集合是Twitter对象和Facebook对象的集合。每个类都有所需的属性@我非常感谢你。这就是我一直在寻找的:)还有一件事——我有一个关于content control的master detail的想法——我现在需要绑定content control,那么现在如何绑定它呢?我是否只针对我的接口绑定它@克里斯:我需要使用ContentTemplateSelector并自己编程吗?@Flipper:不是100%确定你的确切意思,但是我可以定义一个ContentControl
,然后你可以将它绑定到列表框的SelectedItem
。如果将数据模板移动到ContentControl.Resources
中,您应该能够再次执行与列表框
相同的操作(根据对象的确切类型定义多个模板)