Ich brauche Hilfe mit dem folgenden Problem:Wie erstellt man eine Eigenschaft, um den Index des ausgewählten Wertes aus einer anderen Eigenschaft zu speichern?
Ich habe eine Klasse mit zwei Eigenschaften.
private byte m_selectedValue;
public byte SelectedValue
{
get { return m_selectedValue; }
set { m_selectedValue = value; }
}
private string[] m_possibleValues;
public string[] PossibleValues
{
get { return m_possibleValues; }
set { m_possibleValues = value; }
}
Die PossibleValues speichert die Liste der auswählbaren Werte. Der SelectedValue enthält den Index des aktuell ausgewählten Wertes.
In diesem Status zeigt der Eigenschafteneditor den Index des ausgewählten Werts an. Ich möchte den Wert mithilfe einer Combobox im Eigenschaftenraster auswählen, die mit einer Enum-Eigenschaft verwendet wird. Die Liste der Combobox würde von der PossibleValues-Eigenschaft gefüllt werden.
Mit Hilfe dieses Artikels (http://www.codeproject.com/KB/cpp/UniversalDropdownEditor.aspx) habe ich es geschafft, einen benutzerdefinierten Editor zu erstellen, der die Combobox im Eigenschaftenraster mit den Werten aus der PossibleValues-Eigenschaft anzeigt. Ich kann auch den Wert auswählen, aber das Eigenschaftsraster zeigt den Index des Werts anstelle des Werts selbst an.
Dies ist die modifizierte Quelle des Editors ist (original von Codeproject ist):
public class EnumParamValuesEditor : UITypeEditor
{
private IWindowsFormsEditorService edSvc;
public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
{
if ((context != null) && (context.Instance != null))
return UITypeEditorEditStyle.DropDown;
return UITypeEditorEditStyle.None;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value)
{
if ((context == null) || (provider == null) || (context.Instance == null))
return base.EditValue(provider, value);
edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (edSvc == null)
return base.EditValue(provider, value);
ListBox lst = new ListBox();
PrepareListBox(lst, context);
lst.SelectedIndex = (byte)value;
edSvc.DropDownControl(lst);
if (lst.SelectedItem == null)
value = null;
else
value = (byte)lst.SelectedIndex;
return value;
}
private void PrepareListBox(ListBox lst, ITypeDescriptorContext context)
{
lst.IntegralHeight = true;
string[] coll = ((EnumTerminalParam)context.Instance).PossibleValues;
if (lst.ItemHeight > 0)
{
if ((coll != null) && (lst.Height/lst.ItemHeight < coll.Length))
{
int adjHei = coll.Length * lst.ItemHeight;
if (adjHei > 200)
adjHei = 200;
lst.Height = adjHei;
}
}
else
lst.Height = 200;
lst.Sorted = true;
FillListBoxFromCollection(lst, coll);
lst.SelectedIndexChanged += new EventHandler(lst_SelectedIndexChanged);
}
void lst_SelectedIndexChanged(object sender, EventArgs e)
{
if (edSvc == null)
return;
edSvc.CloseDropDown();
}
public void FillListBoxFromCollection(ListBox lb, ICollection coll)
{
lb.BeginUpdate();
lb.Items.Clear();
foreach (object item in coll)
lb.Items.Add(item);
lb.EndUpdate();
lb.Invalidate();
}
}
Natürlich braucht es weitere Modifikationen korrekt einige Situationen zu bewältigen (ex die Possible ist leer.).
So ist es möglich, die PossibleValues [SelectedValue] anstelle des SelectedValue im Eigenschafteneditor anzuzeigen?
Ich dachte, dass die GetStandardValuesSupported und GetStandardValues zum Anzeigen einer Combobox im Eigenschafteneditor verwendet werden. Leider müssen die GetStandardValues eine Auflistung mit Elementen des gleichen Typs wie die Eigenschaft selbst zurückgeben, zumindest nach http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx. Wie kann ich den Eigenschaftseditor so konfigurieren, dass die Combobox mit den Methoden ConvertFrom oder ConvertTo angezeigt wird? – starobrno
Ja, GetStandardValues gibt den nativen Typ (Byte) zurück. Und das wird eine Combobox auslösen. ConvertFrom und ConvertTo führen einfach die Konvertierungen zu/von Ihren benutzerdefinierten Strings durch, so dass die Strings und nicht die Bytes in der Liste angezeigt werden. –