Código LaTeX
Ejemplo usando MultiBinding y MultiValueConverter .Lo que muestra es el código para generar una tabla en LaTeX:
Descargar
Nota: Se requiere el framework 3.5
Estado de excepción digital
Hace 2 meses
...Apuntes de lo que vaya aprendiendo, algo así como el cuaderno del programador...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestWPF_Data_Binding_II
{
public enum TipoDistancia
{
Millas,
Kilometros
}
public class ConvertidorDistancia
{
/// <summary>
/// Convierte Millas a Kilometros y viceversa.
/// </summary>
/// <param name="valorDist">Valor a convertir</param>
/// <param name="tipoDistancia">Tipo de Distancia</param>
/// <returns>Un string conteniendo el valor convertido</returns>
public string Convertir(double valorDist, TipoDistancia tipoDistancia)
{
if (tipoDistancia == TipoDistancia.Millas)
{
return (valorDist * 1.609344).ToString("0.##") + " km";
}
if (tipoDistancia == TipoDistancia.Kilometros)
{
return (valorDist * 0.621371192).ToString("0.##") + " m";
}
throw new ArgumentOutOfRangeException("tipoDistancia");
}
}
}
xmlns:local="clr-namespace:TestWPF_Data_Binding_II"
1: <Window x:Class="TestWPF_Data_Binding_II.DataBinding_Method"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml
"
4: xmlns:local="clr-namespace:TestWPF_Data_Binding_II"
5: xmlns:system="clr-namespace:System;assembly=mscorlib"
6: Title="DataBinding_Method" Height="300" Width="300">
7: <Window.Resources>
8: 9: <!-- Instancia de la clase DoubleToString que impl
ementa a IValueConverter -->
10: <local:DoubleToString x:Key="doubleToString" />
11: 12: <!-- ObjectDataProvider pone al metodo como fuente de datos(origen de enlace/binding source) -->
13: <ObjectDataProvider
14: x:Key="ConvertirDistancia"
15: ObjectType="{x:Type local:ConvertidorDistancia }"
16: MethodName="Convertir" >
17: <!-- Declaramos los parametros que recibe el metodo Convertir-->
18: <ObjectDataProvider.MethodParameters>
19: <system:Double>10</system:Double>
20: <local:TipoDistancia>Millas</local:TipoDistancia>
21: </ObjectDataProvider.Method
Parameters>
22: </ObjectDataProvider>
23: </Window.Resources>
24: 25: <Grid Margin="10">
26: <Grid.ColumnDefinitions>
27: <
ColumnDefinition Width="0.5*"/>
28: <ColumnDefinition Width="0.5*"/>
29: </Grid.ColumnDefinitions>
30: <Grid.RowDefinitions>
31: <RowDefinition Height="31" />
32: <RowDefinition Height="31" />
33: <RowDefinition Height="31" />
34: </Grid.RowDefinitions>
35: 36: <TextBlock Margin="5" Grid.ColumnSpan="2"
37: VerticalAlignment="Center"
38: Text="Ingrese una distancia para convertir :"/>
39: 40: <!-- Este TextBox enlazara al primer parametro del metodo Convertir -->
41: <TextBox
42: Grid.Row="1" Grid.Column="0" Margin="5"
43: Text ="{Binding Source={StaticResource ConvertirDistancia}, Path=MethodParameters[0],
44: BindsDirectlyToSource=true, UpdateSourceTrigger=PropertyChanged,45: Converter={StaticResource doubleToString}}"/>
46: 47: <!-- Este ComboBox enlazara al segundo parametro del metodo Convertir -->
48: <ComboBox
49: Grid.Row="1" Grid.Column="1" Margin="5" Width="80"
50: HorizontalAlignment="Left"
51: SelectedValue="{Binding
52: Source={StaticResource ConvertirDistancia}, 53: Path=MethodParameters[1],54: BindsDirectlyToSource=true}" >
55: <local:TipoDistancia>Millas</local:TipoDistancia>
56: <local:TipoDistancia>Kilometros</local:TipoDistancia>
57: </ComboBox>
58: <TextBlock Grid.Row="2" HorizontalAlignment="Right" Margin="5"
59: Text="Resultado:"/>
60: 61: <!-- Este TextBlock enlaza al resultado del metodo Convertir, es decir, lo que retorna.-->
62: <TextBlock Grid.Row="2" Grid.Column="1" Margin="5"
63: Text="{Binding Source={StaticResource ConvertirDistancia}}"/>
64: 65: </Grid>
66: </Window>
<Window.Resources> y </Window.Resources>.Y puesto que voy a enlazar el metodo Convertir debo instanciar la clase ConvertidorDistancia mediante la clase ObjectDataProvider.Esta clase ajusta y crea un objeto que se puede utilizar como origen de enlace.La operación comienza en la línea 13 y termina en la línea 22. x:Key="ConvertirDistancia"ObjectType="{x:Type local:ConvertidorDistancia }"MethodName="Convertir"<ObjectDataProvider.MethodParameters><system:Double>10</system:Double><local:TipoDistancia>Millas</local:TipoDistancia>Path=MethodParameters[0]BindsDirectlyToSource=trueUpdateSourceTrigger=PropertyChanged<local:TipoDistancia>Millas</local:TipoDistancia>
<local:TipoDistancia>Kilometros</local:TipoDistancia>Text="{Binding Source={StaticResource ConvertirDistancia}}"<local:DoubleToString x:Key="doubleToString" />
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//para implementar ivalueconverter
using System.Windows.Data;
//necersario para CultureInfo
using System.Globalization;
namespace TestWPF_Data_Binding_II
{
[ValueConversion(typeof(double), typeof(String))]
public class DoubleToString: IValueConverter
{
/// <summary>
/// Convierte Double a String.Antes de actualizar el valor del destino de enlace
///el valor pasa por este metodo para ser convertido a String.
/// </summary>
/// <param name="value">Objeto double</param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double val = (double)value;
return val.ToString();
}
/// <summary>
/// Covierte String a Double.Antes de actualizar el valor del origen de enlace
/// el valor pasa por este metodo para ser convertido a Double.
/// </summary>
/// <param name="value">Objeto string</param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
//throw new NotImplementedException();-->cuando no es necesario implementar el metodo.
double val = Double.Parse(value.ToString());
return val;
}
}
}
Converter={StaticResource doubleToString}}
<Window x:Class="TestWPF_Data_Binding_II.DataBinding_XMLData"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DataBinding_XMLData" Height="300" Width="300">
<Window.Resources>
<!--Usar la propiedad Source de XmlDataProvider si tenemos el archivo xml
referenciandolo con la Uri apropiada, como se muestra en el sgte codigo: -->
<!--<XmlDataProvider x:Key="PerrosXML"
Source="Perros.xml"
XPath="Perros"/>-->
<!-- O podemos embeber directamente el xml : -->
<XmlDataProvider x:Key="PerrosXML">
<x:XData>
<!--Si -cuando el xml va embebido- no se deja vacío el atributo xmlns, se producirá un
error, la salida será : "System.Windows.Data.Error exception has occurred"-->
<Perros xmlns="" >
<Perro Nombre="Alco" Color="Blanco" />
<Perro Nombre="Güeso" Color="Gris" />
<Perro Nombre="Pellejo" Color="Negro" />
</Perros>
</x:XData>
</XmlDataProvider>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="80" />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="Bind To XML Data" FontSize="15"
HorizontalAlignment="Center" Grid.Row="0" Margin="3" />
<TextBlock Text="Enlazando un archivo XML" FontSize="15"
HorizontalAlignment="Center" Grid.Row="0" Margin="29" />
<ListBox
ItemsSource="{Binding Source={StaticResource PerrosXML},
XPath=/Perros/Perro/@Nombre}" Grid.Row="1" HorizontalAlignment="Center"/>
</Grid>
</Window>