這甚至可能嗎?我有兩個ObservableCollections。我想綁定和填充其中一個列表框。例如,假設我們有2個按鈕 - 一個用於Twitter,另一個用於Facebook。點擊一個Facebook按鈕,它將填充列表框中的朋友的姓名從facebook observable集合,它會綁定它。點擊Twitter,它將填充與Twitter追隨者列表框和填充列表框並綁定它。如何選擇哪個ObservableCollection綁定到列表框?
如何選擇哪個集合將在列表框中填充?
這甚至可能嗎?我有兩個ObservableCollections。我想綁定和填充其中一個列表框。例如,假設我們有2個按鈕 - 一個用於Twitter,另一個用於Facebook。點擊一個Facebook按鈕,它將填充列表框中的朋友的姓名從facebook observable集合,它會綁定它。點擊Twitter,它將填充與Twitter追隨者列表框和填充列表框並綁定它。如何選擇哪個ObservableCollection綁定到列表框?
如何選擇哪個集合將在列表框中填充?
我只是使用一個可觀察的集合,並根據用戶的選擇進行填充。你也可以用來自兩個源的名稱填充它,並有一個過濾器來過濾掉其中一個或另一個(顯然你需要一個包裝器對象,你可以指出這個名稱是否是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接口或基類。
在您的視圖模型,創建一個公開一個或其他的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}"/>
我使用的Observable集合是這樣的:private ObservableCollection
如果這兩個集合包含不同類型的數據,那麼在同一個'ListBox'中顯示它們的最佳選擇是以某種方式將它們統一起來。例如,創建一個Twitter和Facebook對象可以實現的通用接口,並綁定到該接口。 –
你能告訴我一個這樣的例子嗎? @Sean U – Flipper
完成此操作的非優雅方式是將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}" />
但是Observable Collections中的類型是不同的。我是新手,所以如果我錯了,我很抱歉。 Twitter集合是Facebook對象的Twitter對象和Facebook的集合。每個類都有需要的屬性。 @ChrisWue – Flipper
@Flipper:我已經添加了一些代碼示例。 – ChrisWue
非常感謝。這就是我一直在尋找:)另外一件事 - 我有一個內容控制器的主 - 細節的想法 - 我需要現在綁定內容控制,所以現在如何綁定?我是否將它與我的界面綁定? @ChrisWue – Flipper