
I have a data model that looks like this
public class ItemModel<T> : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
bool _isOverridden;
public bool IsOverridden
{
get => _isOverridden;
set => SetField(ref _isOverridden, value);
}
public T DefaultValue { get; set; }
private T _value;
public T Value
{
get => IsOverridden == true ? _value : DefaultValue;
set
{
_value = value;
IsOverridden = true;
}
}
}
public class Model
{
public ItemModel<string> FirstName { get; } = new ItemModel<string>() { DefaultValue = "Joe" };
public ItemModel<string> LastName { get; } = new ItemModel<string>() { DefaultValue = "Smith" };
public ItemModel<int> Age { get; } = new ItemModel<int>() { DefaultValue = 35 };
}
I tried creating a TypeDescriptorFactory which does expose the child properties - unfortunately they all show up with the same property name - Value
public class CustomDataFactory : TypeDescriptorFactory
{
protected override IList<IPropertyModel> GetPropertyModels(object dataObject, IDataFactoryRequest request)
{
if (dataObject is Model model)
{
var propertyModels = new List<IPropertyModel>();
var contentPropertyDescriptors = TypeDescriptor.GetProperties(model.FirstName);
var propModel = this.CreatePropertyModel(model.FirstName, contentPropertyDescriptors["Value"], request);
propertyModels.Add(propModel);
var contentPropertyDescriptors2 = TypeDescriptor.GetProperties(model.LastName);
var propModel2 = this.CreatePropertyModel(model.LastName, contentPropertyDescriptors["Value"], request);
propertyModels.Add(propModel2);
return propertyModels;
}
return base.GetPropertyModels(dataObject, request);
}
}
Is there a way to change the category and name when using the TypeDescriptorFactory?
Once I get that working my next question will be how do I map my IsOverridden concept in my objects to work like the Columns example ( red icon when Overridden, Reset sets Value = DefaultValue ).