我使用观察集合来存储我绑定到WPF Listview的列表,我的问题是我正在尝试使前端命令正常工作。在最小值如果我单击我的向上移动按钮,它将项目向上移动,但它不会更改列表中已填充的项目。这应该很容易,但我发现它很难。
我的问题是如何根据以下序列正确更改订单号位置以反映用户点击鼠标按钮后更新列表中的其他项目以反映新位置,如目前所示更改现有元素或新附加元素的数量。
Order Display Name Width
1 Title 50
2 Description 150
我使用添加按钮
将一个项目添加到列表中 Order Display Name Width
1 Title 50
2 Description 150
3 Newitem 50
一旦新的列表顺序变为
,我会单击上移按钮 Order Display Name Width
1 Title 50
2 Newitem 50
3 Description 150
使用的代码如下
ObservableCollection<CustomColumnsModel> columnsList = this.WizardData.ConcreteCustomColumnsProxy;
Extensions.MoveItemUp(columnsList, this.listView1.SelectedIndex);
int offset = 0;
var selectedColumnItem = listView1.SelectedItem as CustomColumnsModel;
foreach (CustomColumnsModel item in columnsList)
{
foreach (CustomColumnsModel item in this.listView1.SelectedItems)
{
item.CustomColumnsOrder -= 1;
}else if (listView1.SelectedItem > item)
{
item.CustomColumnsOrder +1;
}
}
以下是我的扩展方法
public static void MoveItemUp<T>(this ObservableCollection<T> baseCollection, int selectedIndex)
{
//# Check if move is possible
if (selectedIndex <= 0)
return;
//# Move-Item
baseCollection.Move(selectedIndex - 1, selectedIndex);
}
这是我的poco课程
public class CustomColumnsModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public const string IdPropertyName = "CustomColumnsID";
private Guid _Id = Guid.Empty;
public Guid CustomColumnsID
{
get { return _Id; }
set
{
if (_Id == value)
return;
_Id = value;
NotifyPropertyChanged(IdPropertyName);
}
}
public string CustomColumnsDisplayName { get; set; }
public int CustomColumnsWidth { get; set; }
public int CustomColumnsOrder { get; set; }
protected void NotifyPropertyChanged(string key)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(key));
}
}
public EnterpriseManagementObject ActualData { get; private set; }
编辑以显示基于建议尝试的代码
foreach (CustomColumnsModel item in columnsList)
{
if (item.CustomColumnsOrder < item.ColumnIndex)
item.CustomColumnsOrder -= 1;
else if (item.CustomColumnsOrder > item.ColumnIndex)
item.CustomColumnsOrder -= 1;
}
答案 0 :(得分:0)
您似乎需要在对象上拥有索引属性,并且每当有人点击up
时,如果它不是最重要的属性,那么您就是&#39;我必须将索引号与其上方的索引号进行交换。
当有人点击down
时,如果它不是最低点,则再次交换项目。
订单id val 1。 。 。 1。一个
2。 。 。 2。 2个
3。 。 。 3。三个
将成为(假设你遇到3):
订单id val 1。 。 。 1。一个
3。 。 。 2。 2个
2。 。 。 3。 3
然后按顺序对它们进行排序。
修改:
// The following will never be smaller than 0
if (selectedIndex <= 0)
return;
// This is not really doing what you want.
baseCollection.Move(selectedIndex - 1, selectedIndex);
你想要一个var item_to_move_up
等于所选索引中的项目,并且一个item_to_move_down
就是它上面的那个(假设你在逻辑中检查了它)不是第一个)
接下来,交换他们的订单值。类似的东西:
var temp_val = item_to_move_up.order;
item_to_move_up = item_to_move_down.order;
item_to_move_down = temp_val;
答案 1 :(得分:0)
我知道这是一篇较旧的文章。 但是,万一有人到这里来...
这是我所做的事的一个例子。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private List<Student> students = new List<Student>()
{
new Student(){ name="Jimmy" },
new Student(){ name="Billy" },
new Student(){ name="Sarah" },
new Student(){ name="Bobby" },
new Student(){ name="Garry" },
new Student(){ name="Eva" },
new Student(){ name="Nancy" }
};
private Student _student;
private class Student
{
public string name { get; set; }
}
private void button1_Click(object sender, EventArgs e)
{
MoveUpDn(true);
}
private void MoveUpDn(bool blnUp)
{
if (_student == null) return;
int idx = students.IndexOf(_student);
if (blnUp)
{
if (idx <= 0) return;
students.Insert(idx - 1, _student);
students.RemoveAt(idx + 1);
idx--;
}
else
{
if (idx >= students.Count - 1) return;
students.Insert(idx + 2, _student);
students.RemoveAt(idx);
idx++;
}
UpdateMyList();
this.listBox1.SelectedIndex = idx;
}
private void Form1_Shown(object sender, EventArgs e)
{
UpdateMyList();
}
private void UpdateMyList()
{
this.listBox1.DataSource = null;
this.listBox1.DataSource = students;
this.listBox1.DisplayMember = "name";
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBox1.SelectedItem == null) return;
if (listBox1.SelectedItem.GetType() != typeof(Student)) return;
Student student = this.listBox1.SelectedItem as Student;
if (student == null) return;
_student = student;
}
private void button2_Click(object sender, EventArgs e)
{
MoveUpDn(false);
}
}
}