2012-05-17 46 views
2

這甚至可能嗎?我有兩個ObservableCollections。我想綁定和填充其中一個列表框。例如,假設我們有2個按鈕 - 一個用於Twitter,另一個用於Facebook。點擊一個Facebook按鈕,它將填充列表框中的朋友的姓名從facebook observable集合,它會綁定它。點擊Twitter,它將填充與Twitter追隨者列表框和填充列表框並綁定它。如何選擇哪個ObservableCollection綁定到列表框?

如何選擇哪個集合將在列表框中填充?

回答

2

我只是使用一個可觀察的集合,並根據用戶的選擇進行填充。你也可以用來自兩個源的名稱填充它,並有一個過濾器來過濾掉其中一個或另一個(顯然你需要一個包裝器對象,你可以指出這個名稱是否是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> 

這會將適當的模板應用到c中的每個對象ollection。所以你可以收集只有臉書聯繫人或只是嘰嘰喳喳聯繫或混合。

另請注意:您不需要通用接口。它也可以工作,如果你只是讓你的ObservableCollection類型object。但是,假設它們由同一個列表框中的相同應用程序顯示,表明您可以找到某種通用基礎,並且可以創建comon接口或基類。

+0

但是Observable Collections中的類型是不同的。我是新手,所以如果我錯了,我很抱歉。 Twitter集合是Facebook對象的Twitter對象和Facebook的集合。每個類都有需要的屬性。 @ChrisWue – Flipper

+0

@Flipper:我已經添加了一些代碼示例。 – ChrisWue

+0

非常感謝。這就是我一直在尋找:)另外一件事 - 我有一個內容控制器的主 - 細節的想法 - 我需要現在綁定內容控制,所以現在如何綁定?我是否將它與我的界面綁定? @ChrisWue – Flipper

0

在您的視圖模型,創建一個公開一個或其他的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}"/> 
+0

我使用的Observable集合是這樣的:private ObservableCollection _twitterUser;在TwitterUserProfile中。 obeservable集合中的對象是不同的類型。 TwitterUserProfile具有我需要的所有屬性。 Facebook有不同的屬性。我是新來的wpf和綁定等等。 – Flipper

+0

如果這兩個集合包含不同類型的數據,那麼在同一個'ListBox'中顯示它們的最佳選擇是以某種方式將它們統一起來。例如,創建一個Twitter和Facebook對象可以實現的通用接口,並綁定到該接口。 –

+0

你能告訴我一個這樣的例子嗎? @Sean U – Flipper

0

完成此操作的非優雅方式是將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}" /> 
相關問題