none
Problema con ListBox enlazado a SampleData RRS feed

  • Pregunta

  • Hola, tengo un problemilla con un Listbox a ver si me podeis ayudar.

    Tengo definido en la pagina principal en XAML este ListBox:

        <ListBox x:Name="listboxarticuloI" ItemTemplate="{StaticResource ItemTemplate}" ItemsSource="{Binding Collection}" Margin="0,101,0,0" SelectionChanged="listboxarticuloI_SelectionChanged"/>

    Esta enlazado con un SampleData y muestra bien los items, tiene definido el evento listboxarticuloI_SelectionChanged()

    Necesito saber el item seleccionado y me da ese item correctamente con:

    nunarticulo=(listboxarticuloI.SelectedIndex)

    ahora lo que necesito es saber el contenido de ese item seleccionado y pruebo con:

    cadena= Convert.ToString(listboxarticuloI.SelectedValue);

    Y no me muestra el valor del item, me muestra una cadena con lo siguiente: Expression.Blend.SampleData.articulosDataSource.item

    ¿Como puedo hallar el valor del item seleccionado en el ListBox?

    Un Saludo.

    martes, 10 de abril de 2012 14:46

Respuestas

  • Buenas,

    Fíjate que la clase Item está en el espacio de nombres Expression.Blend.SampleData.articulosDataSource por lo tanto desde el código que expusiste debes tener:

    Using Expression.Blend.SampleData.articulosDataSource;

    en el encabezado del archivo .cs.

    Dime algo,

    jm


    José Miguel Torres

    • Marcado como respuesta tristancs miércoles, 11 de abril de 2012 9:13
    miércoles, 11 de abril de 2012 7:36

Todas las respuestas

  • Hola,

    Si el tipo de Collection es una lista de por ejemplo objetos de la clase Foo, entonces utiliza una conversión explícita así ((Foo)listoxarticulo1.SelectedItem)

    Saludos,


    José Miguel Torres

    martes, 10 de abril de 2012 15:23
  • Lo primero de todo agradecerte la respuesta, ten un poco de compresion conmigo acabo de empezar.

    Con el blend en datos a nivel de proyecto cree uno datos de ejemplo articulosdataSource , Collection y en el campo property1 los datos que quiero que se muestren en el Listbox, al arrastrar a la app me ha creado un ListBox en XAML  

    <ListBox x:Name="listboxarticuloI" ItemTemplate="{StaticResource ItemTemplate}" ItemsSource="{Binding Collection}" Margin="0,101,0,0" SelectionChanged="listboxarticuloI_SelectionChanged"/>

    Cuando hago una cosulta del contenido del item del ListBox la cadena que me muestra es Expression.Blend.SampleData.articulosDataSource.item que es donde debe estar definida la clase articulosdataSource lo he visto en el archivo de recursos articulosdataSource.xaml.cs

    Como no se que tipo de objectos se generan al definir un Sampledata he probado como decias :

    cadena = ((Foo) listboxarticuloI.SelectedItem.ToString());

    Pero me da un error al compilar , no se puede encontrar el o el ombre de espacio de nombres Foo

    Un Saludo.

    martes, 10 de abril de 2012 16:59
  • Hola,

    Tranquilo, nadie nace enseñado. Te explic, Foo era un ejemplo del nombre de la clase. Tu en tu xml de SampleData tienes elementos no? pues el elemento está representado en un archivo cs en forma de clase. Esa clase, a la que yo llamo Foo, tiene un nombre, pues dicho nombre es el que tienes que utilizar. Si no acabas de verlo postea aqui el xml y el modelo, o archivo .cs dónde contiene la clase.

    Saludos,

    jm


    José Miguel Torres

    martes, 10 de abril de 2012 18:12
  • De nuevo muchas gracias ;-)

    Cuando hice el SampleData no lo exporte de un xml , lo cree directamente desde el blend y me creo este archivo articulosDataSource.xaml.cs

    //      *********    NO MODIFIQUE ESTE ARCHIVO     *********
    //      Este archivo se regenera mediante una herramienta de diseño.
    //       Si realiza cambios en este archivo, puede causar errores.
    namespace Expression.Blend.SampleData.articulosDataSource
    {
    	using System; 
    
    // To significantly reduce the sample data footprint in your production application, you can set
    // the DISABLE_SAMPLE_DATA conditional compilation constant and disable sample data at runtime.
    #if DISABLE_SAMPLE_DATA
    	internal class articulosDataSource { }
    #else
    
    	public class articulosDataSource : System.ComponentModel.INotifyPropertyChanged
    	{
    		public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
    		protected virtual void OnPropertyChanged(string propertyName)
    		{
    			if (this.PropertyChanged != null)
    			{
    				this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
    			}
    		}
    
    		public articulosDataSource()
    		{
    			try
    			{
    				System.Uri resourceUri = new System.Uri("/WpRGC;component/SampleData/articulosDataSource/articulosDataSource.xaml", System.UriKind.Relative);
    				if (System.Windows.Application.GetResourceStream(resourceUri) != null)
    				{
    					System.Windows.Application.LoadComponent(this, resourceUri);
    				}
    			}
    			catch (System.Exception)
    			{
    			}
    		}
    
    		private ItemCollection _Collection = new ItemCollection();
    
    		public ItemCollection Collection
    		{
    			get
    			{
    				return this._Collection;
    			}
    		}
    	}
    
    	public class Item : System.ComponentModel.INotifyPropertyChanged
    	{
    		public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
    		protected virtual void OnPropertyChanged(string propertyName)
    		{
    			if (this.PropertyChanged != null)
    			{
    				this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
    			}
    		}
    
    		private string _Property1 = string.Empty;
    
    		public string Property1
    		{
    			get
    			{
    				return this._Property1;
    			}
    
    			set
    			{
    				if (this._Property1 != value)
    				{
    					this._Property1 = value;
    					this.OnPropertyChanged("Property1");
    				}
    			}
    		}
    	}
    
    	public class ItemCollection : System.Collections.ObjectModel.ObservableCollection<Item>
    	{ 
    	}
    #endif
    }
    

    Un Saludo.
    martes, 10 de abril de 2012 19:07
  • ya encontre tambien el xml que crea el Blend, se llama articulosDataSource.xsd

    <?xml version="1.0" encoding="utf-8"?>
    <!--
          *********    NO MODIFIQUE ESTE ARCHIVO     *********
          Este archivo se regenera mediante una herramienta de diseño.
           Si realiza cambios en este archivo, puede causar errores.
    -->
    <xs:schema xmlns:tns="Expression.Blend.SampleData.articulosDataSource" xmlns:blend="http://schemas.microsoft.com/expression/blend/2008" targetNamespace="Expression.Blend.SampleData.articulosDataSource" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="articulosDataSource" type="tns:articulosDataSource" />
      <xs:complexType name="articulosDataSource">
        <xs:sequence>
          <xs:element name="Collection" type="tns:ItemCollection" />
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="ItemCollection">
        <xs:sequence>
          <xs:element maxOccurs="unbounded" name="Item" type="tns:Item" />
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="Item">
        <xs:attribute name="Property1" type="xs:string" />
      </xs:complexType>
    </xs:schema>

    martes, 10 de abril de 2012 19:24
  • Pues en teoria lo que yo llamaba Foo inicialmente, es Item. Pruebalo y cuentanos...

    Fijate, estas poniendo a ItemSource = Collection y este es una colección de Item por lo tanto en SelectedItem equivale a un objeto Item y para acceder a él debes hacer una conversión explícita así:

     ((Item)listoxarticulo1.SelectedItem)

    O sea q para acceder a la propiedad Property1 utilizarias ((Item)listoxarticulo1.SelectedItem).Property1. Cuando accedes a través de cadena= Convert.ToString(listboxarticuloI.SelectedValue); esta lo que estas haciendo es acceder al método ToString de la clase Item.

    Cuentanos... y dime si hay algo q no he acabo de explicarme.

    saludos,

    jm


    José Miguel Torres

    martes, 10 de abril de 2012 21:01
  • Gracias por la contestacion.

    ((Item)listboxarticuloI.SelectedItem).Property1

    El compilador me dice que no se puede encontrar el tipo o el nombre de espacio de nombres "Item" ¿falta una directiva using o una referencia de ensamblado?

    Nada, no hay manera de hacer esa conversion, no me reconoce Item.

    martes, 10 de abril de 2012 22:41
  • Buenas,

    Fíjate que la clase Item está en el espacio de nombres Expression.Blend.SampleData.articulosDataSource por lo tanto desde el código que expusiste debes tener:

    Using Expression.Blend.SampleData.articulosDataSource;

    en el encabezado del archivo .cs.

    Dime algo,

    jm


    José Miguel Torres

    • Marcado como respuesta tristancs miércoles, 11 de abril de 2012 9:13
    miércoles, 11 de abril de 2012 7:36
  • Jose Miguel, muchisimas gracias, funciona perfectamente ya me da el valor del item del listbox, no pense que habia que poner el using con la clase creia que lo cogia por defecto, ahora ya me han quedado claras varias cosas más.

    De nuevo, muchas gracias, llevaba perdido varios dias, mirando ejemplos del Listbox con Binding pero no veia nada.

    Un Saludo :-) 

    Aprovechando la ocasion me gustaria preguntar otra cosilla.

    Desde otra pagina xaml, necesitaba meter los datos de ese Datasource en un array ¿como puedo asociar los datos de ese datasource a un array?, el datasource esta asignado a novel de proyecto o sea que supongo podré acceder a esos datos, ¿ no ?

    Un Saludo de nuevo.


    • Editado tristancs miércoles, 11 de abril de 2012 12:32
    miércoles, 11 de abril de 2012 9:13