WPF 数据网格,在基于值的列中显示 X

本文关键字:显示 于值 数据网 数据 网格 WPF | 更新日期: 2023-09-27 18:35:46

我有一个数据网格,其中包含的行只是描述/值耦合

我想要的不是简单的"描述"和"值"列,而是从 1 到 4(可能值的范围)的列,并在与值对应的列中显示一个 X

换句话说,而不是

Description | Value 
--------------------
Desc1       |   2
Desc2       |   4

类似的东西

Description | 1 | 2 | 3 | 4
----------------------------
Desc 1      |   | X |   |   
Desc 2      |   |   |   | X

我正在考虑通过在对象中执行此操作来做到这一点,但这很丑陋,我想在 WPF 中是可能的

编辑:

添加到已经想到的答案是在所有列中放入"X"并使用 4 个转换器来切换可见性,但我认为这可能只需 1 个转换器即可实现,或者可能是完全不同的方式

WPF 数据网格,在基于值的列中显示 X

您可以通过自定义网格模板来做到这一点,但我认为简单而最好的方法是使用这样的视图模型:

  public class MyViewModel
{
    public MyViewModel(MyModel model)
    {
        Model = model;
    }
    public MyModel Model { get; set; }
    public string Description
    {
        get
        {
            return Model.Description;
        }
    }
    public string One
    {
        get
        {
            if (Model.Value == 1)
                return "X";
            else
                return string.Empty;
        }
    }
    public string Two
    {
        get
        {
            if (Model.Value == 2)
                return "X";
            else
                return string.Empty;
        }
    }
    public string Three
    {
        get
        {
            if (Model.Value == 3)
                return "X";
            else
                return string.Empty;
        }
    }
    public string Four
    {
        get
        {
            if (Model.Value == 4)
                return "X";
            else
                return string.Empty;
        }
    }
}

因此,您只需传递模型并绑定此视图模型的列表即可。

如果你真的在处理整数,你可以在里面放一个Canvas和一个X。然后将Value绑定到 X 的Left,并使用转换器转换值,以便 1 变为 0,2 变为 20,依此类推(我可以建议(v - 1) * 20

关于您在问题中写的第二个想法,如果转换器在某个模板中,则不会被迫使用转换器。使用模板的Triggers。例如,添加一些DataTrigger,将其绑定到值,并将DataTriggerValue设置为 1。然后在DataTrigger内放一个Setter来设置相应 X 的Visibility(这个缺点是你应该在所有 X 上放一个Name