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的新選項卡時,所選項目的設置器會被調用一個空值。爲什麼?什麼是最好的解決方法?
謝謝。
你能複製這個在一個簡單的測試項目?我無法使用上面的示例進行復制。 – Chris
在此期間,我已經解決了這個問題,但是我會嘗試放入一個簡單的測試項目,並在有機會時發佈它。 –
沒問題,我只是想知道我是否錯過了某些東西= D – Chris