【问题标题】:Winforms data binding a control to an element of an array at specific indexWinforms 数据将控件绑定到特定索引处的数组元素
【发布时间】:2016-07-11 19:46:51
【问题描述】:

我正在尝试在 numericupdown 和数组元素之间创建数据绑定。在我的表单中,我尝试创建如下所示的绑定,但它似乎不起作用。任何帮助将不胜感激。

绑定:

nudTest.DataBindings.Add("Value", eac.ESettings.HsvArray[0], "", false,DataSourceUpdateMode.OnPropertyChanged);

数组:

public class ESettings : INotifyPropertyChanged
{

    private int[] hsvArray = new int[6];

    public event PropertyChangedEventHandler PropertyChanged;

          [XmlIgnore]
    public bool PrgVarIsDirty
    {
        get { return prgVarIsDirty; }
        set
        {
            prgVarIsDirty = value;
            OnPropertyChanged("PrgVarIsDirty");
        }
    }

    public int[] HsvArray
    {
        get { return hsvArray; }
        set
        {
            if (value != hsvArray)
            {
                prgVarIsDirty = true;
                hsvArray = value;
                OnPropertyChanged("HsvArray");
            }

        }
    }


    // Create the OnPropertyChanged method to raise the event
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

【问题讨论】:

  • WinForms 不支持这种数据绑定
  • 我应该以不同的方式来做这件事还是我运气不好?
  • 当您想将控件绑定到数组的元素,而不是尝试直接绑定到元素,将控件绑定到数组,然后将 CurrencyManager 的位置设置为该元素的索引数组中的元素。

标签: c# winforms data-binding


【解决方案1】:

当您想将控件绑定到数组的元素时,而不是尝试直接绑定到元素,将控件绑定到数组,然后将CurrencyManagerPosition 设置为该元素的索引在数组中。

例如,以下代码将NumericUpDown 绑定到数组并显示30,即索引2 处的元素:

int[] array = new int[] { 10, 20, 30, 40 };
private void Form1_Load(object sender, EventArgs e)
{
    this.numericUpDown1.DataBindings.Add("Value", array, "");
    ((BindingManagerBase)this.numericUpDown1.BindingContext[array]).Position = 2;
}

可以使用BindingSource 完成相同的绑定。将array设置为绑定源的DataSource,使用绑定源进行数据绑定即可。然后显示特定元素,设置Position of BindingSource

【讨论】:

  • 如果模型对象应该从另一个 BindingSource 提供,例如在 DataGridView 的多个列中显示数组元素,其中每个数组是 DataGridView 行,则此方法效果不佳。
  • @BenVoigt 上面的示例是针对特殊情况的解决方法:“将控件数据绑定到特定索引处的数组元素”。 DataGridView 支持复杂的数据绑定。例如,假设您有一个类别列表,每个类别都有一个产品列表,并且您想在 DataGridView 中显示所选类别的产品列表,那么使用两个绑定源就足够了,一个用于类别另一个用于关系/导航属性。
  • 对于更复杂的情况,如果数据绑定不方便,您可以定义自定义类型描述符。例如,看看这个:stackoverflow.com/questions/65794579/… 或这个:stackoverflow.com/questions/65925733/… 这些例子与这个问题无关,但它们展示了如何使用类型描述符的力量进行数据绑定。
  • 是的,这就是我打算走的路。这有点复杂,因为我不能只将 PropertyDescriptor 与 DataGridView 列相关联,该列需要一个 DataMember 字符串并坚持使用类型描述符查找该字符串。希望架构师能够以这种方式对其进行更容易的扩展。
  • 我的特殊情况是用户可以通过配置文件定义新列。自定义列的数据位于数据类的 Dictionary 中。我可以在没有数据绑定的情况下构建网格内容,但是我会失去对预定义属性的更改的自动刷新。为简单起见,请考虑一个预定义列“状态”和多个自定义列。显示行时状态值将多次更改,添加行后其他预定义或自定义列都不会更改。
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 2019-11-20
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多