如何选择要绑定到列表框的可观察集合

本文关键字:列表 集合 观察 绑定 何选择 选择 | 更新日期: 2023-09-27 18:34:26

这可能吗?我有两个可观察集合。我想用其中一个绑定和填充列表框。例如,假设我们有 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联系人或混合进行收集。

另请注意:您不需要通用接口。如果您只是制作 objectObservableCollection,它也将起作用。但是,鉴于它们由同一应用程序在同一列表框中显示,表明您可以找到某种公共基,并且可以创建 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;
} 

然后在 XAML 中,只需绑定到属性:

<ListBox ItemsSource="{Binding SelectedFriendList}"/> 

实现此目的的一种不优雅的方法是将 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}" />