Renderizando uma interface do usuário usando IValueConverter usando apenas código c #
Eu sou c # esilverlight-5 principiante.
Primeiro eu tive que criar um objeto desserializando uma string xml. Fiz isso com sucesso, mas agora o próximo passo é criar uma GUI usando os elementos do objeto. Eu tenho uma idéia que eu tenho que usar "IValueConverter
"por fazer isso. Mas como isso eu não sei.
A classe My Program que contém o objeto é assim:
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Runtime.Serialization.Json;
using System.Runtime;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.IO;
using System.Collections.Generic;
using System.Diagnostics;
using System.Xml;
using System.Collections;
namespace Model.XML
{
public class ProgramControl
{
public static void Main()
{
string xmlstring = @"<?xml version='1.0' encoding='utf-8' ?>
<parameter>
<name>max_amount</name>
<label>Max Amount</label>
<unit>Millions</unit>
<component>
<type>Combo</type>
<attributes>
<type>Integer</type>
<displayed>4</displayed>
<selected>0</selected>
<items>
<item>5</item>
<item>10</item>
<item>20</item>
<item>50</item>
</items>
</attributes>
</component >
</parameter>";
XmlSerializer deserializer = new XmlSerializer(typeof(Parameter));
XmlReader reader = XmlReader.Create(new StringReader(xmlstring));
Parameter parameter = (Parameter)deserializer.Deserialize(reader);
foreach (var item in parameter.Component.Attributes.Items)
{
Debug.WriteLine(item);
}
Debug.WriteLine(parameter.Component.Type);
Debug.WriteLine(parameter.Name);
Debug.WriteLine(parameter.Label);
Debug.WriteLine(parameter.Unit);
}
}
}
Agora, a pergunta é como posso criar uma GUI a partir do objeto obtido na desserialização (IValueConverter)?
EDIT: Eu tenho pouca idéia de como isso pode ser alcançado:
A primeira coisa é que na classe que contém a interface "IValueConverter", temos que converter (usando a função Convert ()) os objetos (obtidos na desserialização) em parâmetros e depois passar esses parâmetros (contendo a caixa de combinação criada em c # aqui) atravésreturn
no código xaml, que contém o contêiner para renderizar a GUI que acabamos de criar usando c #.
E no código Xaml, apenas precisamos criar um contêiner que exibirá a caixa de combinação e outros rótulos e texto que criamos no código c # na etapa anterior. (Não precisamos criar uma caixa de combinação usando xaml aqui, ela é criada em código c # dentro da classe que contém a interface IValueConverter que retorna a interface do usuário).
Por exemplo: (É uma idéia difícil fazer você entender corretamente, pode haver algum erro sintático):
Minha classe "MyValueConverter.cs" é suposta:
public class MyValueConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
List<parameter> list = value as List<Parameter>;
List<UIElement> result = new List<UIElement>();
foreach(parameter p in list)
{
UIElement newEle = null;
if (p.component.type == "Combo")
{
newEle = new ComboBox();
}
result.add(newEle);
}
return result;
/////////////////////////////////////////////////
//////////////// and so on ://///////////////////
/////////////////////////////////////////////////
}
}
Enquanto no arquivo xaml eu tenho que criar um container que renderize a UI criada em c # (classe de interface IValueConverter).Portanto, temos que escolher qualquer contêiner que possa ser capaz de renderizar a caixa de combinação, o rótulo e o texto de todos os dados mostrados na GUI do instantâneo (o conatiner pode ser StackPanel porque há mais de uma coisa a ser exibida).
meu código xaml conterá apenas um container como este:
<UserControl x:Class="RenderingTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:this="clr-namespace:RenderingTest.Converters"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.Resources>
<this:MyValueConverter x:Key="ImageConverter"/>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White" Width="Auto" Height="Auto">
<!-- There should be container here to render the combo box
created using c# code in "MyValueConverter" class -->
</Grid>
</UserControl>
Alguma ajuda para conseguir isso, por favor? Por favor, não hesite em perguntar se ainda não conseguiu entender.