激活视图后,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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-