Winforms双向数据绑定:强制更新字段

本文关键字:更新 字段 数据绑定 Winforms | 更新日期: 2023-09-27 18:28:11

我希望得到一些关于我的代码中缺少什么的指针
我有一个绑定到对象属性的文本框,该属性是列表中的一项,如果我请求列表中的另一项,则该值不会在表单上更新。

用以下示例进行说明:
txtGain值在打开JSONRequestFileToolStripMenuItem_Click函数后填充
一旦我在cmbSignals组合框中选择了不同的内容,我希望txtGain值也会更新,因为SelectedChannel也会更新。这反过来会更新selectedindex,但不会发生。

基本上,我想根据我在cmbSignals中选择的内容更新我的txtGain值。很明显,绑定在那里,这样我就可以修改文本框中的值,并在绑定到的属性中更新它。

我怀疑我必须以某种方式强制更新绑定,但不确定如何做到这一点。如有任何帮助,我们将不胜感激。

public partial class MainForm : Form
{
    private MyData req;  
    public MainForm()
    {
        InitializeComponent();
        cmbSignals.DisplayMember = "Name";
        cmbSignals.ValueMember = "Value";
    }
    private void openJSONRequestFileToolStripMenuItem_Click(object sender, EventArgs e)  
    {
        string text = File.ReadAllText("sample.json");    
        req = new MyData(JsonConvert.DeserializeObject<SerializedRequest>(text));  
        cmbSignals.DataSource = req.SignalNames;  
        cmbSignals.SelectedValue = req.SelectedChannel;     
        SetBindings();
    }
    private void SetBindings()
    {
        txtGain.DataBindings.Add(new Binding("Text", req, "Gain"));
    }
    private void cmbSignals_SelectedValueChanged(object sender, EventArgs e)
    {
        req.SelectedChannel = Convert.ToInt32(cmbSignals.SelectedValue);
    }
}


public class MyData : INotifyPropertyChanged
{
    private SerializedRequest Data = new SerializedRequest();
    private int selectedIndex = 0;
    public int SelectedChannel
    {
        get
        {
            return selectedIndex + 1;
        }
        set
        {
            this.selectedIndex = value - 1;
        }
    }
    public string Gain
    {
        get
        {
            return Data.signals[selectedIndex].gain;
        }
        set
        {
            Data.signals[selectedIndex].gain = value;
            OnPropertyChanged("Gain");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
    public List<SignalsCmbItem>SignalNames
    {
        get
        {
            List<SignalsCmbItem>channels = new List<SignalsCmbItem>();
            for(int i = 0; i<Data.signals.Count;i++)
            {
                channels.Add(new SignalsCmbItem { Value = i + 1, Name = i+1 + " - " + Data.signals[i].label });
            }
            return channels;
        }
    }
}

Winforms双向数据绑定:强制更新字段

相当烦人的"特性",不是吗?。

但不用担心,为了解决这个问题,在更改req.SelectedChannel的值后,在cmbSignals_SelectedValueChanged(sender, e)方法中添加一行代码。

txtGain.BindingContext = new BindingContext();