微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

激活视图后,WPF MVVM加载DataGrid列显示索引

如何解决激活视图后,WPF MVVM加载DataGrid列显示索引

好吧,我已经尝试了很多不同的事情,所以希望我不会弄乱到目前为止我已经尝试过的事情。

作为旁注,我正在与Caliburn Micro合作,并尝试遵循MVVM模式。

我正在尝试在加载viewmodel时以编程方式对数据网格的列进行重新排序(以便用户可以将其设置保存为网格)。

属性的绑定正在起作用,并反映了它们的当前值。

为测试行为,我以特殊的顺序设置了displayIndexes和ColumnNames的Dictionary

public class OrderSumUpviewmodel : Screen,IHandle<DialogEvent>,IHandle<logoutEvent>
{
    public BindableCollection<UIProcessstepModel> Processsteps { get; set; }
    public BindableCollection<UIOrderModel> OrdersBc { get; set; }

    private List<Predicate<UIOrderModel>> criteria = new List<Predicate<UIOrderModel>>();

    private ISaveAndLoadSettings settings;
    private IEventAggregator events;
    private IWindowManager manager;
    private ModifyStatus modifyStatus;
    private bool IsCancelationPlausibleThroughDialog;
    private string cancelMessage;
    public Dictionary<int,string> ColPositions;

    public OrderSumUpviewmodel(IEventAggregator events,IWindowManager manager,ISaveAndLoadSettings settings) {
        this.settings = settings;
        this.events = events;
        this.manager = manager;
        this.events.Subscribe(this);

        this.OrdersBc = new BindableCollection<UIOrderModel>(new UIAllOrdersModel().GetAll());
        this.Orders = CollectionViewSource.Getdefaultview(OrdersBc);

        this.Processsteps = new BindableCollection<UIProcessstepModel>(UIAllProcessstepsModel.GetAll());

        this.modifyStatus = new ModifyStatus();

        SetinitialValues();
    }

    private void SetinitialValues() {
        this.ColPositions = new Dictionary<int,string>()
        {
            [0] = "ColPosDue",[1] = "ColPosCode",[2] = "ColPosstatus",[3] = "ColPosMat",[4] = "ColPosProgress",[5] = "ColPosQuantity",[6] = "ColPosUnit",[7] = "ColPosItemCode",[8] = "ColPosItemName",[9] = "ColPosOrderDate",[10] = "ColPosExpectedFinishDate",[11] = "ColPosOrderedByEmp",[12] = "ColPosDepartment",[13] = "ColPosProcesssteps",[14] = "ColPosAdditions",[15] = "ColPosProject",[16] = "ColPosCommission"
        };

        if (Activeusermodel.GetAdminPermission()) {
            IsCancelButtonVisible = true;
        }

        deleteFilter();
    }

    private ICollectionView orders;

    public ICollectionView Orders
    {
        get
        {
            return this.orders;
        }

        set
        {
            this.orders = value;
            NotifyOfPropertyChange(() => Orders);
        }
    }

    #region Column Properties

    public int ColPosDue
    {
        get { return GetColPosition("ColPosDue"); }
        set
        {
            ReorderColPositions(value,"ColPosDue");
        }
    }

    public int ColPosstatus
    {
        get { return GetColPosition("ColPosstatus"); }
        set
        {
            ReorderColPositions(value,"ColPosstatus");
        }
    }

    public int ColPosMat
    {
        get { return GetColPosition("ColPosMat"); }
        set
        {
            ReorderColPositions(value,"ColPosMat");
        }
    }

    public int ColPosProgress
    {
        get { return GetColPosition("ColPosProgress"); }
        set
        {
            ReorderColPositions(value,"ColPosProgress");
        }
    }

    public int ColPosCode
    {
        get { return GetColPosition("ColPosCode"); }
        set
        {
            ReorderColPositions(value,"ColPosCode");
        }
    }

    public int ColPosOrderDate
    {
        get { return GetColPosition("ColPosOrderDate"); }
        set
        {
            ReorderColPositions(value,"ColPosOrderDate");
        }
    }

    public int ColPosOrderedByEmp
    {
        get { return GetColPosition("ColPosOrderedByEmp"); }
        set
        {
            ReorderColPositions(value,"ColPosOrderedByEmp");
        }
    }

    public int ColPosDepartment
    {
        get { return GetColPosition("ColPosDepartment"); }
        set
        {
            ReorderColPositions(value,"ColPosDepartment");
        }
    }

    public int ColPosProcesssteps
    {
        get { return GetColPosition("ColPosProcesssteps"); }
        set
        {
            ReorderColPositions(value,"ColPosProcesssteps");
        }
    }

    public int ColPosExpectedFinishDate
    {
        get { return GetColPosition("ColPosExpectedFinishDate"); }
        set
        {
            ReorderColPositions(value,"ColPosExpectedFinishDate");
        }
    }

    public int ColPosQuantity
    {
        get { return GetColPosition("ColPosQuantity"); }
        set
        {
            ReorderColPositions(value,"ColPosQuantity");
        }
    }

    public int ColPosUnit
    {
        get { return GetColPosition("ColPosUnit"); }
        set
        {
            ReorderColPositions(value,"ColPosUnit");
        }
    }

    public int ColPosItemCode
    {
        get { return GetColPosition("ColPosItemCode"); }
        set
        {
            ReorderColPositions(value,"ColPosItemCode");
        }
    }

    public int ColPosItemName
    {
        get { return GetColPosition("ColPosItemName"); }
        set
        {
            ReorderColPositions(value,"ColPosItemName");
        }
    }

    public int ColPosAdditions
    {
        get { return GetColPosition("ColPosAdditions"); }
        set
        {
            ReorderColPositions(value,"ColPosAdditions");
        }
    }

    public int ColPosProject
    {
        get { return GetColPosition("ColPosProject"); }
        set
        {
            ReorderColPositions(value,"ColPosProject");
        }
    }

    public int ColPosCommission
    {
        get { return GetColPosition("ColPosCommission"); }
        set
        {
            ReorderColPositions(value,"ColPosCommission");
        }
    }
    #endregion

    #region Rearrange Columns
    private int GetColPosition(string columnName) {
        return ColPositions.FirstOrDefault(x => x.Value == columnName).Key;
    }

    #endregion
}

}

上面的代码是我尝试将正确的列顺序保存在词典中时的第一次尝试。但是,一旦开始加载列值,词典的值就会切换到原来的值,不再适合原始值,因此用户的列顺序混乱了。我想解决这个问题。最初,值可能不会更改,直到数据网格完全加载,然后值才可能更改...

另一种尝试是设置属性的后备字段,并仅在开始时调用方法以从字典中获取所需的显示索引。由于发生了自动重新排序,因此我尝试反映实际的属性状态,并将其与字典中的显示索引进行比较,然后重做每列的设置,直到以正确的方式对其进行排序。

private void SetinitialValues() {
        this.ColPositions = new Dictionary<int,[16] = "ColPosCommission"
        };

        if (Activeusermodel.GetAdminPermission()) {
            IsCancelButtonVisible = true;
        }

        deleteFilter();
        SetAllColumnPositions();
    }
  
   #region private Members of Column Properties
    private int colPosDue;
    private int colPosstatus;
    ...more columns follow
    #endregion

    public int ColPosDue
    {
        get { return colPosDue; }
        set
        {
            colPosDue = value;
        }
    }

    public int ColPosstatus
    {
        get { return colPosstatus; }
        set
        {
            colPosstatus = value;
        }
    }
   ...more column properties follow

  private void SetAllColumnPositions() {
        bool isOrderRearranged;

        foreach (int column in ColPositions.Keys.ToList()) {
            SetActualColumnorder();
            isOrderRearranged = true;
            do {
                if (ActualColPositions[column] != ColPositions[column]) {
                    switch (ColPositions[column]) {
                        case "ColPosDue":
                            colPosDue = column;
                            NotifyOfPropertyChange(() => ColPosDue);
                            isOrderRearranged = false;
                            break;
                       //...for each column
                        default:
                            break;
                    }
                } 
            } while (isOrderRearranged);
        }
    }

    private void SetActualColumnorder() {
        Type type = this.GetType();

        ActualColPositions = new Dictionary<int,string>();

        for (int i = 0; i <= 16; i++) {
            ActualColPositions.Add(i,"");
        }

        foreach (PropertyInfo prop in type.GetProperties()) {
            if (prop.Name.StartsWith("ColPos")) {
                ActualColPositions[int.Parse(prop.GetValue(this).ToString())] = prop.Name;
            }
        }
    }

在设置新的显示索引(从位置16开始)时,我尝试以相反的顺序执行这些步骤。

通过构造函数调用以正确的方式设置显示索引后,将再次设置列属性,但我真的不知道为什么以及何时设置索引。

enter image description here

enter image description here

那是最终值...

任何建议将不胜感激。

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。