Hi
I am trying to create a dynamic dataform with dynamic questions, using a json retrieved from a database.
These questions can be different types (text, int, picker, date, etc.).
As far as i understand the only data source you can assign to the dataform is a class of type NotifyPropertyChangedBase. Each property declared in the class is a question in the dataform.
How can i dynamically create these properties and set the proper editor based on the type? The json contains the question text and type (among other things but they are not relevant for my problem).
Thanks for any advice!
Roy
10 Answers, 1 is accepted
Currently, our DataForm support only binding to CLR objects. What it currently lack is a suitable extension point to plug the custom generation logic as it currently it requires PropertyInfo properties. However, with the upcoming release (in the mid of Septemeber) we will add an extension point.
With the updated version you would be able to use the following snippet:
public
class
JSONMetadataProvider : PropertyMetadataProviderBase
{
private
List<EntityProperty> entityProperties =
new
List<EntityProperty>();
public
override
List<EntityProperty> EntityProperties
{
get
{
return
entityProperties;
}
}
public
override
void
Initialize(
object
source)
{
var data = JObject.Parse(source.ToString());
foreach
(JObject item
in
data[
"questions"
])
{
foreach
(var jProperty
in
item.Properties())
{
var metadata =
new
EntityPropertyMetadata()
{
Group = ...,
Header = ...,
PropertyType = ...,
PropertyType = ...,
...
};
var property =
new
JsonEntityProperty(jProperty, item, metadata);
}
}
}
}
public
class
JsonEntityProperty : EntityProperty
{
private
JProperty property;
public
JsonEntityProperty(JProperty property,
object
item, EntityPropertyMetadata metadata) :
base
(property, item, metadata)
{
this
.property = property;
}
public
override
object
OriginalValue
{
get
{
return
property.Value;
}
}
public
override
void
Commit()
{
//TODO: implement
throw
new
NotImplementedException();
}
}
The setup of the DataForm will look like that:
dataForm.MetadataProvider =
new
JSONMetadataProvider();
dataForm.Source = jsonData;
We will also issue an article describing the specific case of binding the json.
Thank you for bringing the use case to our attention. I have updated your telerik points acordingly
Regards,
Tsvyatko
Telerik by Progress
Hey and thanks for the reply
we have since moved on to using Monotouch.Dialog and are too far in develoment to changing back. But this might come in handy for the next project! ;)
Hi Tsvyatko, is this feature available now? Can you please point me to the article mentioned "We will also issue an article describing the specific case of binding the json."
Thanks in advance
Thank you for getting back to us!
You can check this article how to apply custom datasource to dataform including scenario where JSON is used to supply the data. You can also check the code in our demo app shipped with suite installation - C:\Program Files (x86)\Telerik\UI for Xamarin R1 2017\Examples\XamarinForms
Regards,
Tsvyatko
Telerik by Progress
When building the forms at runtime (where we cannot populate classes with fields upfront) how is the forms GUI field type also dynamically defined? (e.g. DateEditor vs PickerEditor etc). I can see some attributes referring to Type but they appear to be the type of the custom metadata properties of the field, or the type of the field values being committed, rather than the GUI type of the field itself.
Thanks,
Normally, you're correct and the best practices approach would be to use the type's member to set the editor, for example:
dataForm.RegisterEditor(nameof(EmployeeModel.Name), EditorType.TextEditor);
However you can pass a plain string instead:
dataForm.RegisterEditor(nameof(
"Name"
), EditorType.TextEditor);
This does require that you need to know what that field's name is going to be. So either you already know what the member names are, or you will need to check the object graph to see what those properties will be first, then set up your editors.
Regards,
Lance | Tech Support Engineer, Sr.
Progress Telerik
Hi
I used this sample code in this path:
C:\Program Files
(x86)\Telerik\UI for Xamarin R1 2017\Examples\XamarinForms
Unfortunately, I do not have access to the
propertytype atribiute in the initialize method in the CustomMetadataProvider
class. I want to create a dynamic dataform with dynamic editor, using a json
retrieved from a website. And the dataforms of this program each have different
editors (text, , picker, date, check
box…), But since I do not have access to type of editors, I can’t do this. In
this Sample, you can only dynamically add a simple texteditor, How can I have a
dynamic dataform so that I can dynamically add fields like DateEditor;
PickerEditor or CheckBoxEditor?
[quote]Tsvyatko said:Hello Roy,
Currently, our DataForm support only binding to CLR objects. What it currently lack is a suitable extension point to plug the custom generation logic as it currently it requires PropertyInfo properties. However, with the upcoming release (in the mid of Septemeber) we will add an extension point.
With the updated version you would be able to use the following snippet:
public
class
JSONMetadataProvider : PropertyMetadataProviderBase
{
private
List<EntityProperty> entityProperties =
new
List<EntityProperty>();
public
override
List<EntityProperty> EntityProperties
{
get
{
return
entityProperties;
}
}
public
override
void
Initialize(
object
source)
{
var data = JObject.Parse(source.ToString());
foreach
(JObject item
in
data[
"questions"
])
{
foreach
(var jProperty
in
item.Properties())
{
var metadata =
new
EntityPropertyMetadata()
{
Group = ...,
Header = ...,
PropertyType = ...,
PropertyType = ...,
...
};
var property =
new
JsonEntityProperty(jProperty, item, metadata);
}
}
}
}
public
class
JsonEntityProperty : EntityProperty
{
private
JProperty property;
public
JsonEntityProperty(JProperty property,
object
item, EntityPropertyMetadata metadata) :
base
(property, item, metadata)
{
this
.property = property;
}
public
override
object
OriginalValue
{
get
{
return
property.Value;
}
}
public
override
void
Commit()
{
//TODO: implement
throw
new
NotImplementedException();
}
}
The setup of the DataForm will look like that:
dataForm.MetadataProvider =
new
JSONMetadataProvider();
dataForm.Source = jsonData;
We will also issue an article describing the specific case of binding the json.
Thank you for bringing the use case to our attention. I have updated your telerik points acordingly
Regards,
Tsvyatko
Telerik by Progress
[/quote]
The code snippet Tsvyatko provided is a preview of what you'll be able to do an upcoming version of UI for Xamarin. The reason you're not seeing the EntityPropertyMetadata.PropertyType is because it is not available in 2017.3.1018.240 (which is the latest release).
When it is released, you'll be able to set the property type there and the RadDataForm will provide the appropriate editor for that type. If you have any implementation issues when you first try it, open a support ticket here and we'll dig deeper.
Note: I noticed that you do not have a license (trial or purchased), make sure you're added as the licensed user so that you can submit tickets. It takes less than a minute to assign you as the user and can be done here on the Manage Licensed Users page.
Regards,
Lance | Tech Support Engineer, Sr.
Progress Telerik
Hi Lance
thanks for the reply. We hope that the next release will be released as soon as possible.
Thanks for any advice!