可以說我有一個ObservableCollection WPF應用程序中的ViewModel。此集合與Model集合同步,以便更新其中一個更新另一個。該模型有一條業務規則,規定它必須始終包含2件事情,但集合中的順序可以更改。用戶將看到一個列表,其中有兩件事情,並有按鈕,他們可以點擊來移動一件事。模型類訂閱它的集合的更改處理程序,並在集合中的事件少於2件時拋出異常。C#集合是否存在「Atomic Move」操作?
是這樣的(非常簡化,邊緣情況下不處理等)
public class ViewModel
{
private Model _model;
public ObservableCollection<Thing> Things { get; set; }
public Thing SelectedThing { get; set; }
public ViewModel(Model model)
{
_model = model;
Things = new ObservableCollection<Thing>(_model.Things);
// Some other code that ensures the model and viewmodel collections stay in sync
// ...
}
public void MoveUp()
{
var selected = SelectedThing;
int i = Things.IndexOf(selected);
Things.Remove(selected); // Throws exception
Things.Insert(i - 1, selected);
}
}
public class Model
{
public ObservableCollection<Thing> Things { get; set; }
public Model()
{
Things = new ObservableCollection
{
new Thing(),
new Thing()
};
Things.CollectionChanged += CollectionChangedHandler;
}
private void CollectionChangedHandler(object sender, CollectionChangedEventArgs e)
{
if(e.Action == CollectionChangedAction.Remove)
{
if(Things.Count < 2)
{
throw new YouCantDoThatException();
}
}
}
}
基本上,當用戶點擊「上移」,所選擇的項目被暫時從集合中刪除與上述這是其中插入之前。儘管這對於模型來說是一個無效的狀態,但我無法改變模型,因爲它是一個用於很多其他事情的API。有沒有辦法在C#做一個「原子移動」操作,這將允許我移動該項目而不先刪除它?
我試圖避免從observablecollection派生,但它可能是我唯一的選擇。我會檢查移動方法,我不知道我是如何錯過的。 – ConditionRacer
移動實際上做我需要做的事情。謝謝! – ConditionRacer
剛剛運行檢查時,我附加了一個監聽器,它告訴我變更時的集合狀態。當我移動一個項目時,我收到的集合作爲事件源顯示新項目集合的新版本。 – Chris