Attached behavior no detecta ciertos eventos

21 mayo 2012

Problema: He creado un attached behavior, y al usarlo para que maneje algunos eventos, como por ejemplo MouseDown, no parece que pase nada, el evento no parece ser detectado por el codigo del behavior

Solucion: Esto suele ser debido a que controles de usuario como MenuItem atrapan en evento y no dejan que se propage (handled = true). Para evitar esto podemos usar los eventos Preview-*, por ejemplo, en este caso hariamos que el behavior respondiera ante el evento PreviewMouseDown, en vez del evento MouseDown

Obtener la ventana a la que pertenece un control de WPF

9 mayo 2012

Problema: Uno un poco tonto. Como puedo obtener la ventana a la que pertenece un control en WPF, a partir del propio control?

Solucion: Desde codigo se podria hacer con esta sencilla instruccion:

window = Window.GetWindow(obj);

Donde obj es el objeto del que queremos obtener su ventana. Solo quedaria chequear previamente si el objeto es ya uno de tipo Window, en cuyo caso obviamente bastaria con devolver el propio objeto.

Como duplicar una imagen de virtual box

26 julio 2010

Problema: Tengo una imagen de virtual box de un windows xp, corriendo en un windows 7, y la quiero duplicar para tener 2 máquinas virtuales, pero tras crear una nueva máquina virtual y decirle a virtual box que use la copia del archivo que contiene el disco duro que acabo de hacer, me sale un error diciendo que ya existe otra máquina con el mismo UUID registrado.

Solución: Ejecutar en la consola el siguiente comando sobre el archivo con la imagen de disco duro original o sobre la copia. (Solo uno de ellos, para que no tengan el mismo UUID) Por ejemplo:

VBoxManage internalcommands sethduuid C:\imagenes\miCopiaDelArchivo.vdi

VBoxManage.exe es un comando que se encuentra en el directorio de instalación de virtual box.

Mi servicio WCF dejo de escribir logs

28 junio 2010

 

Problema: Tengo un servicio WCF, y tengo habilitado el escribir logs, ya sea mediante el sistema de log que trae WCF o mediante un custom listener para poder usar alguna libreria de logs (como NLog o Log4Net). El problema es que en un momento dado para de escribir logs, aunque mi servicio sigue funcionando normalmente. Si reinicio el servicio, vuelve a escribir logs.

Solucion: Seguramente el valor de la propiedad “maxMessagesToLog” no ha sido configurado. Esta propiedad tiene un valor por defecto de 1000, y cuando se llega a ese limite se deja de escribir nuevos logs.

Para eliminar este limite, usar el valor –1

<system.serviceModel>
    <diagnostics>
        <messageLogging maxMessagesToLog="-1" />
    </diagnostics>
</system.serviceModel>

Stacktrace de un servicio WCF

20 abril 2010

 

Problema: Tengo un servicio WCF que me casca. Como puedo ver el volcado de la pila?

Solucion: Marcar la clase que implementa el contrato con el siguiente atributo

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]

WCF me añade un elemento root al serializar las clases

14 abril 2010

 

Problema: He creado una clase con un serializador a medida implementando el interfaz IXmlSerializable, pero WCF añade al xml resultante un elemento raiz adicional con el nombre de la clase y con un namespace propio.

Solucion: Tendremos que marcar la clase con el siguiente atributo para indicarle a WCF los valores para el nodo raiz:

[XmlRoot(Namespace=http://uri.org, ElementName="raiz")]

El atributo se encuentra en el namespace System.Xml.Serialization

WCF no me serializa a XML como yo quiero

14 abril 2010

 

Problema: Necesito serializar mis datos de una forma diferente a como lo hace el serializador que usa WCF (DataContractSerializer), ya sea porque sus opciones son limitadas (no permite usar atributos en el XML) o porque necesito una estructura diferente en el XML a la que me ofrece el serializador.

Solucion: Proveer a la clase a serializar de un serializador a medida, al que llamara WCF. Para ello hacemos que la clase a serializar  implemente el interfaz System.Xml.Serialization.IXmlSerializable. Deberemos implementar el metodo WriteXml donde podremos crear un XML a partir de la clase a mano y a nuestro gusto. (Nota: estaremos obligados a implementar tambien el metodo GetSchema, pero bastara con añadir una linea con “return null”

Que tengo que poner en el web.config para crear un servicio WCF que trabaje con soap, xml y json?

14 abril 2010

 

Problema: Quiero crear un servicio web con WCF con 3 endpoints, uno para soap, otro para json y otro para xml, y no se que tengo que especificar en el webconfig.

Solucion: Tras crear con VS nuestro proyecto WCF, ya tendremos el primer endopint creado para soap. Para los otros dos endpoints habria que añadir lo sieguiente:

Dentro de <system.serviceModel> añadimos la seccion <bindings> (si no esta ya)

<bindings>
        <webHttpBinding>
        <binding name="webBinding">
        </binding>
    </webHttpBinding>
</bindings>

En la seccion <services>, dentro del <service> que ya tendremos creado (y que ya contara con algun endpoint) añadimos dos mas

<endpoint name="xml" address="xml" binding="webHttpBinding" bindingConfiguration="webBinding" behaviorConfiguration="XMLBehavior" contract="IContractService"/>

<endpoint name="json" address="json" binding="webHttpBinding" bindingConfiguration="webBinding" behaviorConfiguration="JSONBehavior" contract="IContractService"/>

 

Finalmente en la seccion <behaviors> añadimos

<endpointBehaviors>
<behavior name="XMLBehavior">
    <webHttp/>
</behavior>
<behavior name="JSONBehavior">
    <enableWebScript/>
</behavior>
</endpointBehaviors>

Por ultimo, si las llamadas xml las queremos hacer usando el metodo POST, deberemos marcar los metodos en cuestion del contrato con el atributo [WebInvoke(Method = “POST”)]. Ademas, tendremos que añadir una referencia a System.ServiceModel.Web en nuestro proyecto.

ObservableCollection y propiedades

26 marzo 2010

Problema: Tengo una ObservableCollection que contiene una coleccion de objetos que son de tipo de una clase creada por mi. Esta ObservableCollection esta bindeada a un elemento XAML. Cuando añado o quito elementos el elemento XAML se me actualiza, pero cuando modifico las propiedades de los elementos de la coleccion, el elemento XAML no se entera.

Solucion: Hacer que nuestra clase a la que pertenecen los objetos de la ObservableCollection implemente el interfaz INotifyPropertyChanged. Al implementar la interfaz necesitaremos añadir a nuestra clase un nuevo evento publico de tipo PropertyChangedEventHandler.

public event PropertyChangedEventHandler PropertyChanged;

Finalmente, para las propiedades que queramos que actualicen el elemento XAML tendremos que hacer que cuando cambien de valor (en el SET de la propiedad) lancen el evento antes comentado. Ejemplo con una propiedad llamada “miPropiedad”:

set
{
    _miPropiedad = value;
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs("MiPropiedad"));
    }
}

Como obtengo los indices de los elementos seleccionados en un Listview de WPF?

26 marzo 2010

 

Problema: Tengo un listview con seleccion multiple activada, y quiero objtener los indices de los elementos que estan seleccionados. La propiedad SelectedIndex no me vale porque solamente me devuelve uno de ellos.

Solucion: (.NET framework 3.5) Recurrir a la propiedad SelectedItems y obtener el indice para cada uno de ellos

List<int> result = new List<int>();
foreach (object o in lv.SelectedItems)
{
       result.Add(lv.Items.IndexOf(o));
}

(siendo lv el ListView en cuestion)


Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.