private void OnZOrderChanged(object sender, ZOrderChangedEventArgs e) { //ZOrderChanged?.Invoke(sender, e); if (ZOrderChanged != null) { ZOrderChanged(sender, e); } }
private void Field_ZOrderChanged(object sender, ZOrderChangedEventArgs e) { // field.Zorder == e.newValue var field = sender as IField; if (field == null || e.PreviousValue == e.NewValue) { return; } // zorder should be THE key. fields.Remove(e.PreviousValue); var toBePosition = fields.Keys.IndexOf(e.NewValue); if (toBePosition == -1) { fields.Add(field.ZOrder, field); return; } // IField replacedItem = null; IField replacingItem = field; field.ZOrderChanged -= this.Field_ZOrderChanged; Func <int, int> opp; // now i have to move previous item on a position if (e.NewValue < e.PreviousValue) { opp = (i) => i + 1; } else { opp = (i) => i - 1; } var prevPos = field.ZOrder; var pos = toBePosition; while (pos != -1) { replacedItem = fields.Values[pos]; replacedItem.ZOrderChanged -= this.Field_ZOrderChanged; //cleaning new space fields.Remove(replacingItem.ZOrder); // inserting on a new place replacingItem.ZOrderChanged += this.Field_ZOrderChanged; fields.Add(replacingItem.ZOrder, replacingItem); // setting new id that tepends on a direction. replacedItem.ZOrder = opp(replacedItem.ZOrder);//Everything should be handled recursively. pos = fields.Keys.IndexOf(replacedItem.ZOrder); replacingItem = replacedItem; } replacingItem.ZOrderChanged += this.Field_ZOrderChanged; fields.Add(replacingItem.ZOrder, replacingItem); }