2012-02-09 71 views
2

我有下面的代碼行之有效:使用Binding.Source不使用資源的

<Viewbox.Resources> 
    <CollectionViewSource x:Key="viewSource" 
          Source="{Binding Path=SelectionList}"> 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription PropertyName="Description" /> 
     </CollectionViewSource.SortDescriptions> 
    </CollectionViewSource> 

</Viewbox.Resources> 
<ComboBox ItemsSource="{Binding Source={StaticResource ResourceKey=viewSource}}"/> 

我想直接把我的CollectionViewSource在我的組合框不使用這樣的任何資源:

<ComboBox SelectedItem="{Binding Path=Value, Mode=TwoWay}"> 
    <ComboBox.ItemsSource> 
     <Binding> 
      <Binding.Source> 
       <CollectionViewSource Source="{Binding Path=SelectionList}"> 
        <CollectionViewSource.SortDescriptions> 
         <scm:SortDescription PropertyName="Description" /> 
        </CollectionViewSource.SortDescriptions> 
       </CollectionViewSource> 
      </Binding.Source> 
     </Binding> 
    </ComboBox.ItemsSource> 
</ComboBox> 

但這樣一來我的組合框始終是空的,我得到以下綁定錯誤:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=SelectionList; DataItem=null; target element is 'CollectionViewSource' (HashCode=1374711); target property is 'Source' (type 'Object')

有誰知道我該怎麼做?

+1

這只是一個猜測,但你可能不得不顯式設置CollectionViewSource.Source的綁定源:' Clemens 2012-02-09 15:44:28

+0

感謝您的評論我檢查了我的綁定錯誤。在你的建議中,我可以放入Source = ... – Nicolas 2012-02-09 16:04:00

+0

將其設置爲擁有SelectionList屬性的對象。 – Clemens 2012-02-09 16:59:47

回答

1

尼古拉斯,雖然這不是一個回答你的問題,因爲它仍然使用的資源,你可以通過它的本地資源字典定義它把CollectionViewSource組合框裏面:

<ComboBox> 
    <ComboBox.Resources> 
     <CollectionViewSource x:Key="viewSource" Source="{Binding Path=SelectionList}"> 
      <CollectionViewSource.SortDescriptions> 
       <scm:SortDescription PropertyName="Description" /> 
      </CollectionViewSource.SortDescriptions> 
     </CollectionViewSource> 
    </ComboBox.Resources> 
    <ComboBox.ItemsSource> 
     <Binding Source="{StaticResource viewSource}"/> 
    </ComboBox.ItemsSource> 
</ComboBox> 
+0

不幸的是,這是行不通的。 – Nicolas 2012-02-09 17:18:00

+0

@Nicolas:這工作得很好,除非你的意思是你不想*這樣做...... – 2012-02-09 19:25:36

+1

@ H.B。這個答案已經被顯着編輯,評論引用了舊的答案。舊的解決方案確實不起作用。 – Clemens 2012-02-09 19:37:25

1

由於CollectionViewSource沒有從中繼承DataContext以在Binding中使用的父節點,所以出現錯誤。

雖然您不需要爲您的ComboBox使用CollectionViewSource。您可以綁定這是項目源到任何集合通過綁定ItemsSource財產

<ComboBox ItemsSource="{Binding SelectionList}" 
      SelectedItem="{Binding Path=Value, Mode=TwoWay}" /> 

唯一缺少的是排序,但是你可以將其返回到之前查看您的視圖模型對數據進行排序。

+0

感謝您的回答。我真的需要在我的視圖中排序,而不是在ViewModel中,這就是我使用CollectionViewSource的原因。你能告訴我爲什麼它在資源中,而不是在ComboBox中。 – Nicolas 2012-02-09 16:31:49

+0

@Nicolas它作爲一種資源,因爲'Binding.Source'屬性指向已經在UI中定義的對象。另外,你不能在不是'DependencyProperty'的屬性上使用綁定,我不認爲'Binding.Source'是一個'DependencyProperty'。根據您的原始集合製作一個從ViewModel返回已排序的「CollectionViewSource」的屬性沒有任何問題。 – Rachel 2012-02-09 16:49:30

+0

@Rachel,它不是在這裏設置的綁定源,而是一個CollectionViewSource的源。 – Clemens 2012-02-09 16:51:21