Archive for the ‘WPF’ 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.

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)

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.