Archive for the ‘.net’ Category

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

Anuncios

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.

Terminar una aplicacion WPF

26 marzo 2010

 

Problema: Como termino una aplicacion WPF sin tener que recurrir al Window.close() de la ventana principal?

Solucion:

System.Windows.Application.Current.Shutdown();

Nota: Esto no termina la aplicacion inmediatamente. Si por ejemplo ejecutamos esto dentro de un bucle while, la aplicacion puede seguir corriendo indefinidamente si no se cumple la condicion de salida del bucle. Mas info aqui

Problemas con ObservableCollection y XAML

5 enero 2010

Problema: Cuando le hago un databinding declarativo (desde xaml)  de un control (p.ej. un gridview o un dropdownlist) a una propiedad  en código que contiene una ObservableCollection, no funciona o no funciona como me esperaba.

Solucion: Hay que revisar que la propiedad DataContext del control está correctamente asignada (o correctamente heredada) para que pueda encontrar la propiedad que contiene la ObservableCollection. Lo mismo para las propiedades path para que los valores que queremos se muestren correctamente.
Hay que tener en cuenta que el objeto ObservableCollection debe de estar disponible como una propiedad pública (get), y que las propiedades de los objetos que contiene la ObservableCollection y que queremos mostrar, también deben de estar disponibles a través de  una propiedad pública(get). 
Hay que tener en cuenta también que debemos haber asignado o creado el objecto ObservableCollection antes de que sea procesado el XAML (llamada a InitializeComponent()), de lo contrario el control que esté bindeado a la propiedad ObservableCollection no se enterará de los cambios en la colección hasta que no volvamos a asignarle en su propiedad correspondiente (p.ej. ItemsSource)  una nueva ObservableCollection sobre la que trabajar.
Por último, tener en cuenta que los cambios solo se verán reflejados automáticamente en WPF si trabajamos con la ObservableCollection original, si asignamos una nueva ObservableCollection a la propiedad que se referencia desde XAML, desde WPF no se apreciarán cambios (ya que en realidad estaríamos modificando otra ObservableCollection diferente, la lista referenciada desde el control no habría cambiado)

WPF, binding a propiedades locales desde XAML

5 enero 2010

Problema: ¿Cómo se puede acceder a las propiedades locales (las del codebehind, vamos) de una ventana o user control WPF desde el XAML?

Solución: La forma más sencilla es asignar al datacontext de la ventana o control la propia ventana o control, con la siguiente declaración:

DataContext="{Binding RelativeSource={RelativeSource self}}"

Esto dentro de la etiqueta <Window> o <UserControl>, dependiendo de lo que se trate.
Así el DataContext de la ventana quedaría fijado a ella misma, y las propiedades públicas serían accesibles escribiendo el nombre de estas.

Cómo se pasa un código de color en HTML a un objeto de .NET

14 julio 2009

Problema: Tengo un un código de color en HTML (Por ejemplo #E8E8F3 y quiero usarlo en .NET, pero no puedo usarlo directamente porque los colores en .NET tienen que ser de la clase System.Drawing.Color y no sé a qué color se corresponde.

Solución: Usar la siguiente función

System.Drawing.ColorTranslator.FromHtml("#E8E8F3")

Y si lo queremos a la inversa, esto nos convertiría un System.Drawing.Color en una cadena con el código HTML

System.Drawing.ColorTranslator.ToHtml(color);

Problemas con expresiones condicionales del tipo <condicion> ? expresion1 : expresion2

8 abril 2009

Problema: Tengo una expresión del tipo <condicion> ? expresion1 : expresion2 y al compilar me da el siguiente error: “Type of conditional expression cannot be determined because there is no implicit conversion between <tipo1> and <tipo2>

Solución: Este problema aparece porque las expresiones de este tipo solo pueden devolver un tipo, no dos. Al poner tipos diferentes como resultado de expresion1 y expresion2 el compilador nos daría ese error. Tenemos que decidir que tipo va a devolver la expresión y hacerle un casting a una de las dos expresiones. O si por un lado queremos devolver null y por otro un tipo primitivo (los cuales no pueden ser null) podemos usar los nullables. Ej:

string filtro;

(filtro.Equals(“todos”)) ? (bool?)null : false;

Problemas al publicar formularios infopath en sharepoint

24 marzo 2009

Problema: Al ir a publicar un formulario infopath que lleva código en un servidor Sharepoint, cuando va a hacer el build del código, me sale un error diciendo que ha habido un error al compilar el código asociado al formulario. Sin embargo, si le hago el build a la solución desde el editor, la solución compila bien.

Solución:  Comprueba que la ruta a la carpeta donde se encuentra la solución no sea demasiado larga. Se puede hacer la prueba moviendo la carpeta con la solución al directorio raiz, e indicarle a infopath la nueva ruta de la solución.

Problemas al usar callbacks simultáneos en asp.net

25 febrero 2009

Problema: Estoy usando callbacks para traerme datos del servidor (implementando el interfaz System.Web.UI.ICallbackEventHandler) , pero cuando lanzo varios a la vez (es decir, que algunos callbacks empiezan sin que hayan terminado los anteriores) esto no parece comportarse como debiera.

Solución: Hay un error en la implementación del método WebForm_CallbackComplete() que es generado por asp.net cuando estamos usando el método  Page.ClientScript.GetCallbackEventReference para que nos cree los scripts necesarios para realizar los callbacks (versión de cuando escribo esto: .NET 3.5)
Para arreglarlo hay que sustituir la función en cuestión por ésta otra. Para ello la incluimos en nuestra página aspx:

function WebForm_CallbackComplete_SyncFixed() {
  for (var i = 0; i < __pendingCallbacks.length; i++) {
   callbackObject = __pendingCallbacks[ i ];
  if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {
      if (!__pendingCallbacks[ i ].async) {
     __synchronousCallBackIndex = -1;
   }
   __pendingCallbacks[i] = null;
   var callbackFrameID = "__CALLBACKFRAME" + i;
   var xmlRequestFrame = document.getElementById(callbackFrameID);
   if (xmlRequestFrame) {
     xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);
   }
   WebForm_ExecuteCallback(callbackObject);
  }
 }
}

Y para que nuestra página use esta función en vez de la que da problemas, incluimos también esto al final de la página:

if (typeof (WebForm_CallbackComplete) == "function") {
  WebForm_CallbackComplete = WebForm_CallbackComplete_SyncFixed;
}

El código para la solución ha sido tomado de aquí

¿Qué tipo de columnas enlazadas a datos se le pueden meter a un gridview?

16 enero 2009

Problema: ¿Cuáles son los tipos de columna que se le pueden meter a un gridview que está enlazado a datos? y luego, ¿cómo puedo acceder a los datos ?

Solución: En éste enlace se pueden ver los tipos de columnas
http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.datacontrolfield(VS.80).aspx

Y para acceder a los datos, usaremos el evento RowDataBound, el cual se lanza después de que se haya realizado un bind a una fila por cada registro. Como parámetro nos llegará la fila a la que se le acaba de hacer el bind, y para acceder a los datos solo tendremos que hacer lo siguiente:

String texto = ((DataRowView) e.Row.DataItem)[“campodelaquerydeldataset”].ToString();

Donde “e” sería el argumento del evento que contiene a la fila afectada.