2014-03-25 47 views
0

WPF,MVVMWPF - 使用CollectionViewSource是導致錯誤二傳手呼叫

我發現,如果我使用一個CollectionViewSource與我的組合框,當我關閉窗口,到的SelectedValue二傳手額外調用執行,如果SelectedValue被綁定到一個字符串屬性。如果我將ItemsSource綁定直接設置到VM,則不會發生此調用。額外的呼叫導致虛擬機中的值發生變化,導致數據不正確。我有其他ComboBoxes設置相同的方式,但它們綁定到整數值。

CollectionViewSource定義:

<CollectionViewSource x:Key="AllClientsSource" Source="{Binding AllClients}" > 
    <CollectionViewSource.SortDescriptions> 
    <scm:SortDescription PropertyName="ClientName" /> 
    </CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

組合框與CollectionViewSource:

<ComboBox Grid.Column="2" 
      ItemsSource="{Binding Source={StaticResource AllClientsSource}}" 
      DisplayMemberPath="ClientName" SelectedValuePath="ClientId" 
      SelectedValue="{Binding Path=ClientId}" 
      Visibility="{Binding Path=IsEditingPlan, Converter={StaticResource BoolVisibility}}" /> 

組合框直接到VM(放棄排序):

<ComboBox Grid.Column="2" ItemsSource="{Binding AllClients}" 
      DisplayMemberPath="ClientName" SelectedValuePath="ClientId" 
      SelectedValue="{Binding Path=ClientId}" 
      Visibility="{Binding Path=IsEditingPlan, Converter={StaticResource BoolVisibility}}" /> 

誰能告訴我爲什麼有一個額外的setter調用使用CollectionViewSource?字符串綁定有什麼不同?有沒有辦法正確解決它?

編輯:我試着改變它,並使用組合框上的SelectItem屬性。同樣的結果。因此,如果該項目是標量數據類型,它似乎按預期工作。如果它是一個對象,則會得到一個額外的setter調用,其值爲空值。同樣,如果我從等式中刪除CollectionViewSource,它將按預期工作。

編輯,再次:我添加了一個鏈接到sample project,說明了這個問題。目標.Net 4.5。

  • 運行該項目。
  • 單擊以顯示查看一個
  • 選擇一個客戶端,客戶名稱將顯示在右側。
  • 單擊以顯示查看兩個
  • 返回查看一個 - 請注意,選定的客戶端不再被選中。
  • 單擊以顯示查看三個
  • 選擇一個區域,並在該區域的名稱顯示在右側。
  • 返回查看兩個
  • 返回查看三 - 請注意,所選區域仍處於選中狀態。

視圖之間的唯一區別是One和Two使用CollectionViewSource。三個直接綁定到ViewModel。當您移動到One或Two的新選項卡時,所選項目的設置器會被調用一個空值。爲什麼?什麼是最好的解決方法?

謝謝。

+0

你能複製這個在一個簡單的測試項目?我無法使用上面的示例進行復制。 – Chris

+0

在此期間,我已經解決了這個問題,但是我會嘗試放入一個簡單的測試項目,並在有機會時發佈它。 –

+0

沒問題,我只是想知道我是否錯過了某些東西= D – Chris

回答

0

顯然這是從可視化樹中刪除CollectionViewSource時引起的......我將CollectionViewSource移動到ViewModel並將其作爲屬性公開,並且問題得到有效解決。