Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何选择要绑定到列表框的ObservableCollection?_C#_Wpf_Binding_Listbox_Observablecollection - Fatal编程技术网

C# 如何选择要绑定到列表框的ObservableCollection?

C# 如何选择要绑定到列表框的ObservableCollection?,c#,wpf,binding,listbox,observablecollection,C#,Wpf,Binding,Listbox,Observablecollection,这可能吗?我有两个明显的收集。我想用其中一个绑定并填充一个列表框。例如,假设我们有两个按钮——一个用于Twitter,一个用于Facebook。点击Facebook按钮,它将用Facebook observable collection中的好友姓名填充列表框,并将其绑定。点击Twitter,它将用Twitter追随者填充listbox,并填充listbox并绑定它 如何选择在列表框中填充哪个集合 我只会根据用户的选择使用一个可观察的集合和填充。你也可以用这两个来源的名字来填充它,并用一个过滤器过

这可能吗?我有两个明显的收集。我想用其中一个绑定并填充一个列表框。例如,假设我们有两个按钮——一个用于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
中,您应该能够再次执行与
列表框
相同的操作(根据对象的确切类型定义多个模板)