2012-10-05 44 views
1

我已經具有綁定物品源的組合框...我已經剝奪我的例子下降到關鍵件:如何將ComboBox轉換爲使用綁定的CompositeCollection?

<UserControl x.Class="My.Application.ClientControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"       
      xmlns:conv="clr-namespace:My.Utilities.Converters" 
      Name="ClientControl"> 

    <UserControl.Resources> 
     <ResourceDictionary> 
      <CollectionViewSource Key="x:ClientsCollection" /> 
     </ResourceDictionary> 

     <conv:ClientOptions x:Key="ClientOptions" /> 

    </UserControl.Resources> 

    ... 

    <ComboBox Name="Options" 
       DataContext="ClientsCollection" 
       ItemsSource="{Binding [ClientNumber], Converter={StaticResource ClientOptions}" /> 

</UserControl> 

這工作,但我現在要一個手動項目添加到我的組合框將觸發所謂的替代功能「其他...」所以我不必移動使用CompositeCollection ......像這樣:

<ComboBox Name="Options" 
      DataContext="ClientsCollection"> 
    <ComboBox.ItemsSource> 
     <CompositeCollection> 

      <CollectionContainer Collection="{Binding [ClientNumber], Converter={StaticResource ClientOptions} /> 
      <ComboBoxItem>Other...</ComboBoxItem> 
     </CompositeCollection> 
</ComboBox> 

嘗試,因爲我可能,綁定的物品是不會填充時使用CompositeCollection。它只顯示手動ComboBoxItem「其他...」。如果我刪除該項目,該列表是空的。如果我給轉換器附加一個斷點,它不會捕獲任何東西,這似乎表明綁定甚至沒有嘗試。

我顯然不理解有關CompositeCollection中的綁定函數是如何發生的。有人可以在我的XAML中看到錯誤或解釋我錯過了什麼?

回答

1

在ComboBox.Resources中聲明CompositeCollection並將其與ItemsSource =「{Binding Source = {StaticResource myCompositeCollection}}」一起使用。

<UserControl x.Class="My.Application.ClientControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"       
     xmlns:conv="clr-namespace:My.Utilities.Converters" 
     Name="ClientControl"> 

<UserControl.Resources> 
    <ResourceDictionary> 
     <CollectionViewSource Key="x:ClientsCollection" /> 
    </ResourceDictionary> 

    <conv:ClientOptions x:Key="ClientOptions" /> 
    <CompositeCollection x:Key="myCompositeCollection"> 

     <CollectionContainer Collection="{Binding Source={StaticResource ClientsCollection}, Path=[ClientNumber], Converter={StaticResource ClientOptions} /> 
     <ComboBoxItem>Other...</ComboBoxItem> 
    </CompositeCollection> 

</UserControl.Resources> 

... 

<ComboBox Name="Options" 
      DataContext="ClientsCollection" 
      ItemsSource="{Binding Source={StaticResource myCompositeCollection}}" /> 

如果您在聲明元素語法ItemsSource屬性裏面的CompositeCollection,對於CollectionContainer.Collection綁定沒有找到它的DataContext。

在參考資料部分,像CompositeCollection這樣的Freezables繼承了它們聲明元素的DataContext,就好像它們是元素的邏輯子元素一樣。但是,這是Resources屬性和屬性(如ContentControl.Content或包含控件的邏輯子項(可能還有一些其他項))的類似屬性的特性。如果使用元素語法來設置屬性的值,一般來說,您將不得不期望像DataContext這樣的屬性的屬性值繼承不起作用,因此沒有顯式源的綁定也不起作用。

+0

你可以充實一下你的答案...如果我將它移動到Resources部分並設置我的ItemsSource = {Binding Source = {StaticResource ...}}如何設置我的CollectionContainer的上下文? – BobTheBuilder

+0

看到我編輯的答案... – hbarck

+0

所以...我的ComboBox目前綁定到數據上下文...我的ClientsCollection;我的ComboBox.ItemsSource綁定到一個選項列表,它將根據我的ClientsCollection中當前選擇的客戶端而改變。我在哪裏定義這種關係[上下文]?在資源或組合框?你能發佈一段代碼片段來澄清嗎? – BobTheBuilder

相關問題