簡體   English   中英

ComboBox綁定中斷對SelectedItem中對象的更改

[英]ComboBox Binding Breaks on Changes to object in SelectedItem

我有一個ComboBox,其ItemSource綁定到一個ObservableCollection,其SelectedItem屬性綁定到T的屬性。兩個屬性都存在於我的視圖模型中。 一切都很好,除了一個導致我撕掉頭發的問題。 當我在綁定到SelectedItem的對象上設置屬性時,ComboBox綁定停止工作。 VS 2012輸出窗口不報告任何綁定錯誤,也不會拋出異常。

XAML

<ComboBox ItemSource="{Binding Path=Connections, Mode=OneWay}"
          SelectedItem="{Binding Path=SelectedConnection, Mode=TwoWay}"
          DisplayMemberPath="Name"/>
<TextBlock Text="{Binding Path=ConnectionName, Mode=TwoWay}" />
<TextBlock Text="{Binding Path=ConnectionGroup, Mode=TwoWay}" />

查看模型

private void SaveChanges() 
{
    this.SelectedConnection.Name = this.ConnectionName;
    this.SelectedConnection.Group = this.ConnectionGroup;

    // -- Save the changes
}

現在所有這些都很好。 但是一旦SaveChanges()完成,ComboBox開始表現得很有趣。 看起來一切都很好,但如果你試圖改變選擇沒有任何反應; 選擇相同的項目並且不激活“SelectedConnection”的setter。 我嘗試系統地在SaveChanges()中注釋掉代碼,如果我只留下一行在SelectedConnection上設置任何屬性,我會發現這種失敗。

我還在控件的代碼后面添加了一個事件處理程序來處理ComboBox上的SelectionChanged事件。 發生中斷后,每當我嘗試通過UI或在代碼中更改值時,事件處理程序會立即連續觸發兩次。 第一個事件args'RelectedItems設置了一個值,這是我剛剛選擇和期望的值。 但是事件會立即再次觸發,事件args的RemovedItems集合中只有一個項目。 該集合還包含我剛剛選擇的項目。

我已經嘗試將SelectedConnection屬性設置為null,然后在方法完成后,設置回相關對象。 沒運氣。

我還看到一篇關於在我的XAML標記上的SelectedItem屬性之后移動ItemSource屬性的舊帖子,但是也沒有效果。

我正試圖避免創建一個影子列表,並試圖讓所有內容保持同步,因為這將是我的下一次嘗試,但這樣做只是變得如此簡單。 任何想法將不勝感激。

如果重要的話,這是構建到4.5框架的Visual Studio 2012。

編輯

我現在也嘗試在設置其屬性后從ObservableCollection中完全刪除修改后的對象。 它仍然顯示它好像是選定的值(它的名稱在ComboBox中立即可見),但它不再顯示在下拉列表中。 即使它不再存在於ItemSource中,它仍然不會允許自己被“取消選擇”。

**更新**

我將有問題的方法更改為完全清空綁定到ItemSource的ObservableCollection,然后在進程結束后將其恢復,如下所示:

private void SaveChanges()
{
    var selected = this.SelectedConnection;

    var name = this.ConnectionName; // -- bound to fields on the view
    var group = this.ConnectionGroup;

    this.Connections = null;
    this.RaisePropertyChanged("Connections"); // -- SelectionChanged fires as expected

    selected.Name = name;
    selected.Group = group;

    this._repository.SaveChanges();

    this.Connections = new ObservableCollection<Connection>(this._repository.AllConnections);
    this.RaisePropertyChanged("Connections"); // -- SelectionChanged event doesn't fire
    this.SelectedConnection = selected;  // -- SelectionChanged event doesn't fire
}

完成之后,ComboBox再次允許我按照您的預期更改值。 但是,所選項目實際上並未顯示為已選中(即使它已在視圖模型中正確設置)。 所以,是的,這是一個非常丑陋的解決方法,它也創造了自己的問題。

剛剛遇到同樣的問題,我想我已經找到了正在做的事情。

它只是在我做了一些最近的更改(代碼分析建議)之后才出現為我有IComparable的類添加equals / hashcode / operator重載,並在組合框的ObservableCollection中使用。 我根據對象的描述性字段制作了哈希碼。 但是,該字段可以由用戶修改,並且在用戶修改該值之后,組合框斷開,無法再取消選擇該項目。

鑒於此對象中沒有不變的字段,因此無法基於對象的屬性創建固定的哈希代碼。 但是,如果我完全刪除哈希碼覆蓋(或將其設置為固定的東西,如type.GetHashCode),一切都會再次起作用。

因此,請檢查您的哈希碼是否基於您正在更改的值。

我放棄了我原先設想的方式。 我沒有直接修改ItemSource集合中的對象,而是將ItemSource集合作為鍵/值對的列表,並根據所選對的鍵從源列表中提取我需要的對象。 我能夠毫無問題地編輯該對象(如預期的那樣)。 它現在有效,我只是在那里添加了一層我希望避免的代碼。 用戶界面還允許我更新對的價值方面,以反映基礎模型的“名稱”字段的更改,而不會給我以前的相同問題。 我只把它算作一個小勝利並繼續前進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM