usar porque interfaces implementacion ejemplos c# silverlight data-binding binding

porque - Presentar una interfaz de usuario usando IValueConverter usando solo el código c#



porque usar interfaces c# (1)

Soy c # y Silverlight-5 principiante.

Primero tuve que crear un objeto deserializando una cadena xml. Lo he hecho con éxito, pero ahora mi próximo paso es crear GUI utilizando los elementos del objeto. Tengo idea de que tengo que usar " IValueConverter " para hacer esto. Pero cómo eso no lo sé.

Mi clase de programa que contiene el objeto es así:

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); } } }

Ahora la pregunta es ¿cómo puedo crear GUI a partir del objeto obtenido en la deserialización (IValueConverter)?

EDITAR: tengo poca idea de cómo se puede lograr:

Lo primero es que en la clase que contiene la interfaz "IValueConverter" debemos convertir (usando la función Convertir) los objetos (obtenidos al deserializar) en parámetros y luego pasar esos parámetros (que contienen el cuadro combinado creado en c # aquí) a través de return al El código xaml que contiene el contenedor para representar la GUI que acabamos de crear usando c #.

Y en el código Xaml solo tenemos que crear un contenedor que muestre el cuadro combinado y otras etiquetas y texto que creamos en el código c # en el paso anterior. (No es necesario crear un cuadro combinado usando xaml aquí, se crea en código c # dentro de la clase que contiene la interfaz IValueConverter que devuelve la UI).

Por ejemplo: (Es una idea aproximada hacerte entender correctamente, puede haber algún error sintáctico):

Mi clase "MyValueConverter.cs" se supone:

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 :///////////////////// ///////////////////////////////////////////////// } }

Mientras que en el archivo xaml tengo que crear un contenedor que represente la interfaz de usuario creada en c # (clase de interfaz IValueConverter). Así que tenemos que elegir cualquier contenedor que debe ser capaz de mostrar el cuadro combinado, la etiqueta y el texto de todos los datos que se muestran en la GUI de la instantánea (el conatiner podría ser StackPanel porque hay más de una cosa que mostrar) .

mi código xaml será simplemente contener un contenedor 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>

¿Alguna ayuda para lograrlo, por favor? Por favor, no dude en preguntar si aún no lo entendía.


Puede usar Tipos de datos implícitos para esto.

En su xaml define una plantilla para un determinado tipo de datos:

<DataTemplate DataType="ComboParameter"> <StackPanel Orientation="Horizontal"> <TextBlock Text={Binding Path=label}" /> <ComboBox ItemsSource="{Binding Path=items}"/> <TextBlock Text="{Binding Path=unit}"/> </StackPanel> </DataTemplate>

Es mejor que cree diferentes tipos según el valor del elemento de tipo. Otra solución es crear una plantilla grande para el tipo Parámetro y mostrar los elementos apropiados según lo que contenga el Tipo de parámetro. Pero no recomendaría este enfoque.

Luego puede usar ItemsControl para mostrar todos los parámetros:

<ItemsControl ItemsSource="{Binding Path=Parameters}" />

Los diferentes parámetros se representarán de diferentes formas según el tipo que tenga.