XAF 字符串属性ComboBox的数据源DataSourcePropertyAttribute提供动态选择的键和值

private string _ActionId;
        [DataSourceProperty(
"list")]
        [Custom(
"PropertyEditorType""MemberLevelSecurityDemo.Module.WinStringArrayValueComboPropertyEditor")]
        
public string ActionId
        {
            
get
            {
                
return _ActionId;
            }
            
set
            {
                SetPropertyValue(
"ActionId"ref _ActionId, value);
            }
        }

        
public List<KeyValue> list = new List<KeyValue>() { new KeyValue("A""B") };
public class KeyValue 
    {

        
public KeyValue(string key, string value)
        {
            
this.Key = key; this.Value = value;
        }
     

        
public string Key { getset; }
        
public string Value { getset; }
    }
using System;
    
using System.ComponentModel;
    
using DevExpress.Xpo;
    
using DevExpress.ExpressApp;
    
using DevExpress.ExpressApp.Win.Editors;
    
using DevExpress.ExpressApp.Model;
    
using DevExpress.XtraEditors;
    
using DevExpress.XtraEditors.Controls;
    
using DevExpress.XtraEditors.Repository;

    
public class WinStringArrayValueComboPropertyEditor : WinPropertyEditor
    {
        
private string dataSourceProperty = string.Empty;
        
public WinStringArrayValueComboPropertyEditor(Type objectType, IModelMemberViewItem info)
            : 
base(objectType, info)
        {
            
this.ControlBindingProperty = "EditValue";
            dataSourceProperty 
= info.DataSourceProperty;
        }

        
protected override object CreateControlCore()
        {
            DevExpress.XtraEditors.LookUpEdit combo 
= CreateControl();
            combo.Properties.QueryPopUp 
+= combo_QueryPopup;

            
return combo;
        }

        
protected override void Dispose(bool disposing)
        {
            LookUpEdit combo 
= this.Control as LookUpEdit;
            
if (combo != null)
            {
                combo.Properties.QueryPopUp 
-= combo_QueryPopup;
            }
            
base.Dispose(disposing);
        }

        
protected override void OnControlCreated()
        {
            UpdateComboValues();
            
base.OnControlCreated();
        }

        
private DevExpress.XtraEditors.LookUpEdit CreateControl()
        {

            LookUpEdit combo 
= new LookUpEdit();
            combo.Properties.DisplayMember 
= "Key";
            combo.Properties.ValueMember 
= "Value";
            combo.Properties.DropDownRows 
= 10;
            
//combo.Properties.TextEditStyle = this.AllowEdit.ResultValue ? TextEditStyles.Standard : TextEditStyles.DisableTextEditor;

            
// Do any more combo setups here
            return combo;
        }

        
private void UpdateComboValues()
        {
            
if (this.CurrentObject != null)
            {
                LookUpEdit combo 
= (LookUpEdit)this.Control;
             
                
try
                {
                    Type t 
= this.CurrentObject.GetType();
                    
////string[] values = (string[])((XPCustomObject)this.CurrentObject).GetMemberValue(this.dataSourceProperty);
                    object datasource = (t.GetField(this.dataSourceProperty)).GetValue(this.CurrentObject);
                           
                    
if (datasource != null)
                    {
                        combo.Properties.DataSource 
= datasource;
                    }
                }
                
catch (Exception exception1)
                {
                    Exception ex 
= exception1;
                    
throw new UserFriendlyException(ex);
                }
            }
        }

        
private void combo_QueryPopup(object sender, CancelEventArgs e)
        {
            UpdateComboValues();
        }

    }
原文地址:https://www.cnblogs.com/Tonyyang/p/2053641.html