Я столкнулся с проблемой, которая может быть разработана в стандартном клиентском приложении, и я не могу воспроизвести его при использовании веб-службы для извлечения информации. По сути, идея заключается в том, что я хочу вытащить пользовательский объект из веб-службы (например, объект клиента) и сделать так, чтобы веб-служба определяла, какие поля будут доступны. Как только клиент получил объект, он присоединит его к PropertyGrid, чтобы пользователь мог визуально увидеть свойства этого объекта.
Первая часть моей проблемы работает. Я могу взять пользовательский объект и передать его клиенту через веб-сервис, и он отобразит их как текстовые поля, которые я могу редактировать. Моя проблема заключается в том, что я хотел бы иметь возможность иметь выпадающие списки доступных значений для поля. Этот список может быть динамическим (доступные значения будут зависеть от внешних факторов).
Доказательство концепции, которое я использовал и пытался заставить работать через веб-сервис, можно найти ниже.
public class TestPropertyGrid
{
private string _text_string= "";
private string _some_String = null;
private string _meds = null;
public TestPropertyGrid()
{
string[] ss_arr = new string[3];
ss_arr[0] = "Zero";
ss_arr[1] = "One";
ss_arr[2] = "Two";
string[] meds_arr = new string[3];
meds_arr[0] = "Heart";
meds_arr[1] = "Blood";
meds_arr[2] = "Cholesterol";
GLobalVars.Add("Meds", meds_arr);
GLobalVars.Add("SomeString", ss_arr);
}
[CategoryAttribute("Basic Category")]
public string TextString
{
get { return _text_string; }
set { _text_string = value; }
}
[TypeConverter(typeof(DynamicStringConverter))]
public string SomeString
{
get
{
string S = "";
if (_some_String != null)
{
S = _some_String;
}
else
{
string[] arr = (string[])GLobalVars.Get("SomeString");
if (arr.Length > 0)
{
S = arr[0];
}
}
return S;
}
set { _some_String = value; }
}
[TypeConverter(typeof(DynamicStringConverter))]
public string Meds
{
get
{
string S = "";
if (_meds != null)
{
S = _meds;
}
else
{
string[] arr = (string[])GLobalVars.Get("Meds");
if(arr.Length > 0){
S = arr[0];
}
}
return S;
}
set {_meds = value;}
}
}
static class GLobalVars
{
internal static Dictionary<string, object[]> dictionary = new Dictionary<string, object[]>();
public static object[] Get(string key)
{
return dictionary[key];
}
public static void Add(string key, object[] value)
{
dictionary.Add(key, value);
}
public static void Set(Dictionary<string, object[]> dict)
{
dictionary = dict;
}
}
public class DynamicStringConverter : StringConverter
{
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
//true means show a combobox
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
//true will limit to list. false will show the list,
//but allow free-form entry
return true;
}
public override System.ComponentModel.TypeConverter.StandardValuesCollection
GetStandardValues(ITypeDescriptorContext context)
{
Console.WriteLine("Property Desc.name: " + context.PropertyDescriptor.Name);
return new StandardValuesCollection(GLobalVars.Get(context.PropertyDescriptor.Name));
}
}
Краткое описание происходящего. У меня есть некоторые частные свойства, которые управляются через их методы Get / Set. Некоторые из которых получают значения из массива при необходимости.
Преобразователь динамических строк вызывается, когда PropertyGrid ищет значения массива и возвращает правильный набор на основе имени свойства из словаря.
Как я могу
а) повторить это для работы с веб-службы?
или если я просто не могу этого сделать,
б) Какие существуют подходы для решения этой проблемы?