我正在处理一个包含SpinEdit(数字上下)控件和ComboBoxEdit的用户控件。在组合框中选择的选项提供了一个乘以SpinEdit中的数字的因子。目前,我有这样的事情:
public class MyUserControl : DevExpress.XtraEditors.XtraUserControl
{
private static List<String> listItems;
static MyUserControl() // Populate the list of options with the default options
{
listItems = new List<String?();
listItems.Add("Option1");
listItems.Add("Option2");
listItems.Add("Option3");
}
public MyUserControl()
{
InitializeComponent();
// Add default options to the combo box
foreach (String item in listItems)
{
this.cboBox.Properties.Items.Add(item);
}
}
}
工作正常(注意上面的内容是简化的,实际上静态列表是一个静态字典,它将字符串映射到乘法因子),除了我想允许用户向listItems
添加自定义选项并在我的应用程序中显示这个用户控件的每个实例。这就是为什么listItems
是静态的,因为我的希望是this.cboBox.Properties.Items = listItems;
,以便listItems
的任何添加都出现在每个控件上。但是,Items
属性是只读的,所以我不能这样做。
如何确保我的用户控件的每个实例都具有相同的选项集,即使这些选项已更改?让静态成员在用户更改选项列表时触发事件可能会有所帮助,但对于看起来像这样简单的事情来说,这似乎有些过分。有没有人有其他想法?
答案 0 :(得分:0)
我不知道DevExpress控件(您可能想在他们的支持论坛上询问),但在经典的Windows组合框中,列表保留在控件内。 Items属性是一个.Net包装器,使内部结构更易于使用。因此,不可能为每个组合框分配相同的数据结构。他们有自己的副本。
您对现在的静态列表具有发布/订阅机制的想法似乎是一种合理的解决方案。
如果是我,而不是在控件类上使用静态内容,我将使主列表容器成为一个单独的类,并在控件上有一个属性,该属性接受该类的实例。它使您的整体架构更加灵活和可测试。
答案 1 :(得分:0)
在您的情况下,最好使用LookUpEdit
控制而不是ComboBoxEdit
。只需对其进行一些调整:
lookUpEdit1.Properties.ShowHeader = false;
您可以这样使用listItems
:
lookUpEdit1.Properties.DataSource = listItems;
但Dictionary
DataSource
存在问题。对于DataSource
,您必须使用实现IList
,ITypedList
或IBindingList
接口的集合。因此,您可以将Dictionary
转换为List
,也可以使用此技巧:
private static Dictionary<int, string> items;
//...
lookUpEdit1.QueryPopUp += lookUpEdit_QueryPopUp;
lookUpEdit2.QueryPopUp += lookUpEdit_QueryPopUp;
//...
private void lookUpEdit_QueryPopUp(object sender, CancelEventArgs e)
{
var lookUpEdit = (LookUpEdit)sender;
lookUpEdit.Properties.DataSource = null;
lookUpEdit.Properties.DataSource = items;
}
但我认为最好使用List
代替Dictionary
。