У меня есть свойство в моем World
классе, которое выглядит так:
public Vec2 Gravity
{
get {
Console.WriteLine("Getting gravity!");
return GetGravity();
}
set {
Console.WriteLine("Setting gravity!");
SetGravity(value);
}
}
«Получение гравитации!» Строка отображается, как и ожидалось, когда PropertyGrid
пытается прочитать значение, но когда я пытаюсь изменить вектор гравитации и нажать клавишу ввода, ничего не происходит. Почему нет?
Мой Vec2
класс обладает свойствами:
public float X
{
get
{
return x;
}
set
{
x = value;
}
}
public float Y
{
get
{
return y;
}
set
{
y = value;
}
}
которые видны на сетке благодаря:
public class Vec2Converter : ExpandableObjectConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, System.Type destinationType)
{
if (destinationType == typeof(Vec2)) return true;
else return base.CanConvertTo(context, destinationType);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType)
{
if (destinationType == typeof(string) && value is Vec2)
{
Vec2 vec = (Vec2)value;
return string.Format("{0}, {1}", vec.X, vec.Y);
}
else return base.ConvertTo(context, culture, value, destinationType);
}
}
Я только что добавил эти два метода в Vec2Converter
и теперь он работает:
public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType)
{
if (sourceType == typeof(string)) return true;
else return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
try
{
string strVal = value as string;
var parts = strVal.Split(',');
float x = float.Parse(parts[0]);
float y = float.Parse(parts[1]);
return new Vec2(x, y);
}
catch
{
throw new ArgumentException("Can not convert '" + (string)value + "'to type Vec2");
}
}
else return base.ConvertFrom(context, culture, value);
}
Работает как путем изменения строкового представления, так и отдельных свойств. Почему thix исправляет это в случае с индивидуальными свойствами ??
I думаю ответ состоит в том, что Vec2
является структурой, поэтому, когда World
возвращает вектор Gravity
, он передает его по значению, а затем копирует изменен, а не фактический Gravity
вектор.
Решение, я думаю, состоит в том, чтобы сохранить методы CanConvertFrom
и ConvertFrom
на месте. Я предполагаю, что они заставляют его работать, потому что они изменяют строковое представление вектора гравитации, а затем , что в свою очередь обновляет фактический вектор гравитации. Это или создание Vec2
класса должно работать, но сейчас я не могу это проверить, потому что мое приложение очень зависит от того, является ли оно структурой.