2010-07-26 11 views
11

Estoy intentando vincular la clave de un diccionario a una fila de la grilla en un cuadro de lista, y vincular el valor del diccionario a otra fila de la grilla. El tipo de clave es Libro, una clase que escribió y el tipo de valor es int. quiero escribir los elementos de la clase y el valor entero en la grilla. ¿Me pueden ayudar en esto? Estoy bastante confundido al determinar los itemsSource y el tipo de datos para enlazar. gracias por ayudarEnlazar la clave y el valor de un diccionario en un cuadro de lista con wpf

Editar: olvidé decir que estoy usando C# - wpf. =)


envié el diccionario como la ItemsSource, y he especificado el diccionario como el tipo de ObjectDataProvider etiqueta, y trataron de enviar el valor (int) por este código:

< TextBlock Text="{Binding Value, Mode=OneWay}" Grid.Row="1" Width="65" > 

y la SelectedItem se muestra como [myNameSpace.Book, 4] en lugar de solamente 4.


BookListBox.ItemsSource = LibManager.Books; 

esto es lo que he escrito en Win dow.xaml.cs and Books es una BookList, donde BookList es un tipo de diccionario < Book, int>.

y el archivo XAML:

< ListBox Height="571" HorizontalAlignment="Left" Margin="444,88,0,0" 
      Name="BookListBox" VerticalAlignment="Top" Width="383" > 
     < ListBox.Resources> 
      <ObjectDataProvider x:Key="BookData" 
           ObjectType="{x:Type local:BookList}"/> 
     </ListBox.Resources> 
     < ListBox.ItemTemplate> 
      < DataTemplate> 
       < Border BorderThickness="2" BorderBrush="Black" Margin="5" 
         CornerRadius="5" Width="350" > 
        < Grid DataContext="{StaticResource BookData}" > 
         < Grid.ColumnDefinitions> 
          < ColumnDefinition/>       
         </Grid.ColumnDefinitions> 
         < Grid.RowDefinitions> 
          < RowDefinition/> 
          < RowDefinition/> 
         < /Grid.RowDefinitions> 
         < Label Content="count: " /> 
         < TextBlock Text="{Binding Value, Mode=OneWay}" 
            Grid.Row="1" Width="65"/> 
        < /Grid> 
       < /Border> 
      < /DataTemplate> 
     < /ListBox.ItemTemplate> 
    < /ListBox> 

hay un problema más con mi code-- no puedo ver los elementos enumerados en cuadro de lista. Quiero decir que pude obtener los valores por ListBox.SelectedItem pero no pude ver en el cuadro de lista. por lo tanto, no puedo estar seguro de si podría pasar el valor entero a donde quiero.

Así que creo que también necesito ayuda para este problema primero ... Escribo una etiqueta que escribo a mano, y otra etiqueta que debe rellenarse mediante el enlace de datos en la misma fila, pero puedo ver la primera etiqueta, pero puedo alcanzar el valor en el código detrás.

+0

Qué idioma/marco está usando? Suena como .NET para mí, pero debes aclarar. – LukeH

+0

Cemre, ¿puedes compartir tu código con nosotros, por favor? –

+0

alguna idea/sugerencia/ayuda? – cemregoksu

Respuesta

29

A continuación código mostrará lo siguiente:

1 
Book 1 
------- 
2 
Book 2 
------- 
3 
Book 3 

SelectedBookIndex se establecerá en el índice del libro seleccionado, en el arranque se seleccionará el segundo libro.

XAML:

Código
<Window x:Class="TestDemo.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="300" Width="300"> 

    <StackPanel> 
     <ListBox 
      ItemsSource="{Binding Path=Books}" 
      SelectedValuePath="Value" 
      SelectedValue="{Binding Path=SelectedBookIndex}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Border BorderBrush="Black" BorderThickness="2"> 
         <StackPanel> 
          <TextBlock Text="{Binding Path=Value}" /> 
          <TextBlock Text="{Binding Path=Key.Name}" /> 
         </StackPanel> 
        </Border> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </StackPanel> 
</Window> 

atrás:

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Windows; 

namespace TestDemo 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      Books = new Dictionary<Book, int>(); 
      Books.Add(new Book() { Name = "Book 1"}, 1); 
      Books.Add(new Book() { Name = "Book 2" }, 2); 
      Books.Add(new Book() { Name = "Book 3" }, 3); 

      SelectedBookIndex = 2; 

      DataContext = this; 
     } 

     public Dictionary<Book, int> Books { get; set; } 

     private int _selectedBookIndex; 
     public int SelectedBookIndex 
     { 
      get { return _selectedBookIndex; } 
      set 
      { 
       _selectedBookIndex = value; 
       Debug.WriteLine("Selected Book Index=" + _selectedBookIndex); 
      } 
     } 
    } 

    public class Book 
    { 
     public string Name { get; set; } 
    } 
} 
+0

esa solución funcionó a la perfección. muchas gracias =) – cemregoksu

+0

No puedo ... ¿Por qué? –

+0

Esta solución ya no funcionará, porque debe cambiar el diccionario a ObservableDictionary (que debe implementar INotifyCollectionChanged e INotifyPropertyChanged) –

0

Quite DataContext="{StaticResource BookData}" del elemento Cuadrícula.

ObjectDataProvider creará una BookList nueva y vacía, y su TextBlock heredará ese DataContext. Si elimina ese atributo, TextBlock obtendrá su DataContext del elemento actual en ItemsControl, que será el KeyValuePair para esa fila. Probablemente pueda eliminar completamente el elemento ObjectDataProvider ya que está creando los datos en el código.

+0

pero ¿no debería implementar el tipo de objeto? – cemregoksu

+0

@cemregoksu: No estoy seguro de lo que quiere decir con 'implementar el tipo de objeto'. No es necesario que proporcione a WPF ningún tipo de información; lo leerá del tipo de tiempo de ejecución del objeto. ObjectDataProvider se usa si desea crear un objeto en XAML utilizando una llamada de método o suministrando parámetros de constructor. Como ya tiene un objeto, puede asignarlo a ItemsSource. – Quartermeister

Cuestiones relacionadas