2010-01-25 22 views
5

Tengo una lista de objetos personalizados: di Frutos con dos propiedades de cadena Nombre y Color. Estos están en una lista.WPF Enlace de la cuadrícula de datos a problemas de la lista

private readonly List<Fruit> fruitList = new List<Fruit>(); 

Luego cargo los objetos de fruta en la lista.

Estoy tratando de obligar a esta lista para WPF DataGrid:

C#:

dgFruit.ItemsSource = "{Binding}"; 

XAML:

<toolkit:DataGrid Name="dgFruit" 
      ItemsSource="{Binding Path=fruitList}" > 
       <toolkit:DataGrid.Columns> 

        <toolkit:DataGridComboBoxColumn 
      Header="Name" 
      SelectedValueBinding="{Binding Path=Name}" 
      TextBinding="{Binding Path=Name}" Width="5*" /> 

        <toolkit:DataGridComboBoxColumn 
      Header="Color" 
      SelectedValueBinding="{Binding Path=Color}" 
      TextBinding="{Binding Path=Color}" Width="5*" /> 

       </toolkit:DataGrid.Columns> 
      </toolkit:DataGrid> 

razón por la que están en un cuadro combinado es porque quiero usuario sea capaz de cambiar la relación. Este no es el verdadero ejemplo, pero entiendes la idea. Diga por el ejemplo que la fruta no estaba madura, entonces cambian el color Banana a verde :)

No estoy teniendo suerte para conseguir estos artículos en la cuadrícula de datos ... y bajar la pista, quiero un haga clic en el elemento de la DataGridCell para cambiar al cuadro combinado y mostrar todos los posibles tipos de nombres de frutas y colores (para que puedan cambiar las relaciones)

Aquí es un error que estoy consiguiendo:

System.Windows.Data Error: 39 : BindingExpression path error: 'Color' property not found on 'object' ''Char' (HashCode=6750311)'. BindingExpression:Path=Color; DataItem='Char' (HashCode=6750311); target element is 'TextBlockComboBox' (Name=''); target property is 'Text' (type 'String') 

puede alguien ayuda? La razón por la que estoy configurando mis columnas en xaml es para poder establecer el ancho del tamaño de estrella y que las columnas tengan el mismo ancho.

Veo que la mayoría de los ejemplos usan un ObservableCollection pero si puedo vincularlo a la lista ¿por qué tengo que usar esto?

favor hágamelo knwo si mi ejemplo se requiere una mayor clarificación

Editar: lo que tengo ahora:

XAML:

  <toolkit:DataGrid Name="dgFruit" 
      ItemsSource="{Binding}" 
      AutoGenerateColumns="False"> 

       <toolkit:DataGrid.Columns> 
        <toolkit:DataGridTextColumn 
         Header="Name" 
         Width="5*"/> 

        <toolkit:DataGridComboBoxColumn 
      Header="Color" 
      Width="5*"/> 

        </toolkit:DataGrid.Columns> 
</toolkit:DataGrid> 

C#:

DataContext = fruitList; 

realidad cuando uso DataContext no obtengo ningún ite Sra. Cuando uso ItemSource, obtengo líneas en blanco, pero el número correcto de filas, así que esto parece más a lo largo de las líneas correctas.

Puedo obtener los datos para mostrar si dejo que Auto genere columnas. Si configuro autogeneratecolumns en false y luego especifico mis columnas en xaml como quiero usar el tamaño de estrellas, obtengo el número correcto de columnas pero ¡no texto!

Respuesta

4

En primer lugar, esto:

dgFruit.ItemsSource = "{Binding}" 

debe establecer el origen de los elementos a una cadena que contiene la palabra unión entre llaves. Esto es casi seguro que no es lo que quieres (de hecho, si haces esto, deberías terminar con una cuadrícula con nueve filas, ¡una para cada personaje de la cadena!). Puede establecer ItemsSource en XAML, o el código detrás, pero no debería hacer ambas cosas. Pruebe lo siguiente:

<toolkit:DataGrid Name="dgFruit"  
        ItemsSource="{Binding}"> 
    ... 
</toolkit:DataGrid> 

Y luego, en el de Visual constructor:

... 
    InitializeComponents(); 
    this.DataContext = fruitList; 
... 

Ahora el contexto de datos para su conjunto visual es el fruto Lista < > y el ItemsSource de la rejilla está dispuesto a ser el mismo objeto Supongo que FruitList es un campo visual en sí mismo.

Los enlaces para sus columnas deben ser algo como:

 <toolkit:DataGridTextColumn Header="Name" 
            Binding="{Binding Name}" 
            Width="5*" /> 
     <toolkit:DataGridComboBoxColumn Header="Color" 
             ItemsSource="{Binding Source={StaticResource AllColors}}" 
             SelectedValueBinding="{Binding Path=Color}" 
             TextBinding="{Binding Path=Color}" 
             Width="5*" /> 

Dónde AllColors se define como un recurso (en este caso):

<x:Array x:Key="AllColors" 
     Type="sys:String"> 
    <sys:String>Orange</sys:String> 
    <sys:String>Yellow</sys:String> 
</x:Array> 

Esto debería empezar.

+0

pero, cuando hago esto, las columnas que defino en xaml se ignoran y se agregan nuevas a la izquierda. ¿Puedo establecer programáticamente tamaños de estrellas para estas columnas generadas automáticamente? – baron

+0

Puede desactivar los generados automáticamente. En su DataGrid en XAML: AutoGenerateColumns = "False" – lesscode

+0

cada vez más cerca, ahora no hay elementos que se muestren :(ver edición reciente – baron

4

WPF no admite el enlace a los campos. Cree una propiedad que tenga acceso a fruitList y vincule a eso.

// this is the field. you can't bind to this 
    private readonly List<Fruit> fruitList = new List<Fruit>(); 

    // this is the property. you can bind to this 
    public List<Fruit> FruitList 
    { 
     get { return fruitList; } 
    } 

Uso dgFruit.DataContext = this; en lugar de dgFruit.ItemsSource = "{Binding}";

Y si desea mostrar estos en un cuadro combinado, es necesario obligar a los DataGridComboBoxColumn a una lista de colores, no sólo una cadena.Por ejemplo, la clase podría ser similar

public class Fruit 
{ 
    public string Name { get; set; } 
    public string Color { get; set; } // bind the combobox selectedvalue to this 

    public List<string> AvailableColors { get; set; } // bind the combobox ItemsSource to this 
} 

y se puede usar un List si lo desea. La ventaja de ObservableCollection es que ya implementa INotifyCollectionChanged y INotifyPropertyChanged para usted

+0

No entiendo lo que quiere decir al crear una propiedad que accede a la lista de productos. Supongo que podría usar ObservableCollection solo que utilizo listas en todos lados. Y entiendo que debe ser una lista. Quiero que esa lista sea todos los valores en Fruit.Color o Fruit.Name. The gridview shuold muestra la relación original, es decir, Apple -> Rojo y Plátano -> Amarillo son los valores, pero si hago doble clic en Apple, veo el combo con todas las opciones de objetos de fruta, por lo que Apple y Banana, y de manera similar con el Color ... – baron

Cuestiones relacionadas