【问题标题】:Event to fire after a System Windows Form element has been updated更新系统 Windows 窗体元素后触发的事件
【发布时间】:2021-01-30 12:37:54
【问题描述】:

我有一个带有一系列列表框的 Windows 窗体

后续列表的内容会根据之前的选择而变化

所有的盒子都绑定到一个启用了 OnListChanged 的​​ BindingList

当添加或删除元素时,我使用它来保留用户指定的“已检查”项目

但是,我注意到如果我将一个项目添加到列表中,它似乎只有在所有其他事件都被触发后才会更新 UI

我已经查看了我希望在 CheckedListBox 和相关 ViewModel 上触发的事件,以便捕获将项目添加到列表中的事件,但到目前为止没有成功

有人可以告诉我,在 UI 更新后哪个事件允许我调用我的“CheckBoxes”方法,否则它们都会再次设置为空白,直到表单被关闭和打开

    private void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        // I've removed the debug statements, but this event when the bound list updates is fired before the UI updates

    }

    private void teams_checked_list_box_SelectedIndexChanged(object sender, EventArgs e)
    {
        // same with this event, and the other events like SizeChanged
    }

已编辑:经过反思,我意识到问题的发生是因为我没有在绑定中设置真/假检查标志,因为我不知道该怎么做。如果有人能指出我正确的方向?目前的代码如下所示:

            teams_checked_list_box.DataSource = Globals.ThisAddIn.TFSTeamsViewModel.ListOfTeamsFromVM.value;
            teams_checked_list_box.DisplayMember = "name";

所以基本上我只是更新项目名称,检查标志在以后处理

【问题讨论】:

    标签: winforms vsto checkedlistbox


    【解决方案1】:

    您如何将项目添加到列表中?您是否要重新绑定列表框?根据您添加项目的方法,基本上有两种方法可以做到这一点:

    1. 如果您要重新绑定,请在添加项目之前捕获事件。循环遍历列表框的 CheckedItems 属性。保存值。添加您的项目。循环遍历新值并重新检查。

    1. 当用户检查列表框中的项目时,使用 ItemChecked 事件捕获该项目,然后将项目的值存储在某处。 (可变的、隐藏的文本框——丑陋,但它可以工作——等等。)如果你只是将项目添加到列表的底部,你可以存储项目的索引。如果您要重新排序列表,则需要存储一个唯一 ID 以引用该项目。 (注意:如果用户取消选中列表框中的项目,您还需要从存储值中删除选中的项目。)然后,在将项目添加到列表框中后,循环返回并在适当的列表框项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多