2

それも可能ですか?2つのObservableCollectionがあります。リストボックスにそれらの1つをバインドして入力したいと思います。たとえば、Twitter用とFacebook用の2つのボタンがあるとします。Facebookボタンをクリックすると、リストボックスにFacebookの監視可能なコレクションからの友達の名前が入力され、バインドされます。Twitterをクリックすると、リストボックスにTwitterフォロワーが入力され、リストボックスに入力されてバインドされます。

リストボックスに入力するコレクションを選択するにはどうすればよいですか?

4

3 に答える 3

2

ユーザーの選択に基づいて、1つの監視可能なコレクションと塗りつぶしを使用します。また、両方のソースからの名前を入力し、どちらか一方を除外するフィルターを設定することもできます(名前が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。ただし、同じリストボックス内の同じアプリによって表示されていることを考えると、ある種の共通ベースを見つけることができ、comonインターフェイスまたはベースクラスを作成できることを示しています。

于 2012-05-17T20:39:08.120 に答える
0

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}"/> 
于 2012-05-17T20:44:15.137 に答える
0

これを実現するためのエレガントでない方法は、2つのリストボックスを同じ場所に配置し、1つをTwitterコレクションにバインドし、もう1つを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}" />
于 2012-05-17T22:27:49.353 に答える