2010-07-26 4 views
11

Sto tentando di associare la chiave di un dizionario a una riga della griglia in una casella di riepilogo e associare il valore del dizionario a un'altra riga della griglia. il tipo di chiave è Book, una classe che ha scritto e il tipo del valore è int. Voglio scrivere gli elementi della classe e il valore intero nella griglia. Potete aiutarmi su questo? Sono abbastanza confuso nel determinare gli itemsSource e il tipo di dati da associare. grazie per l'aiutoAssociazione di chiave e valore di un dizionario in una casella di riepilogo con wpf

Modifica: ho dimenticato di dire che sto usando C# - wpf. =)


ho mandato il dizionario come l'ItemsSource, e ho specificato il dizionario come tipo in ObjectDataProvider tag, e ha cercato di inviare il valore (int) da questo codice:

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

e la SelectedItem è stato mostrato come [myNameSpace.Book, 4] invece di solo 4.


BookListBox.ItemsSource = LibManager.Books; 

questo è quello che ho scritto nella vittoria dow.xaml.cs and Books è una BookList, dove BookList è un tipo di dizionario < Book, int>.

e il file 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> 

c'è un problema più con la mia code-- Non posso vedere gli articoli elencati nella casella di riepilogo. Significo che potrei ottenere i valori da ListBox.SelectedItem ma non potrei vedere nella lista. quindi non posso essere sicuro di poter passare il valore intero a dove voglio.

Quindi penso di aver bisogno anche di un primo aiuto per questo problema ... Scrivo un'etichetta che scrivo a mano e un'altra etichetta che deve essere riempita con l'associazione dati nella stessa riga ma posso solo vedere la prima etichetta, ma posso raggiungere il valore nel codice sottostante.

+0

Che lingua/quadro stai usando? Mi sembra .NET, ma dovresti chiarire. – LukeH

+0

Cemre, puoi condividere il tuo codice con noi per favore? –

+0

qualche idea/suggerimento/aiuto? – cemregoksu

risposta

29

Questi codice mostrerà il seguente:

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

SelectedBookIndex sarà impostato l'indice del libro selezionato, a iniziare il secondo libro verrà selezionato.

XAML:

<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> 

codice dietro:

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

questa soluzione ha funzionato perfettamente. grazie mille =) – cemregoksu

+0

Non riesco a farlo .. Perché ?? –

+0

Questa soluzione non funzionerà più, perché è necessario modificare il dizionario in ObservableDictionary (che deve implementare INotifyCollectionChanged e INotifyPropertyChanged) –

0

Rimuovere DataContext="{StaticResource BookData}" dall'elemento Grid.

ObjectDataProvider creerà una nuova BookList vuota e TextBlock erediterà DataContext. Se si rimuove tale attributo, TextBlock otterrà il suo DataContext dall'elemento corrente in ItemsControl, che sarà KeyValuePair per quella riga. È possibile rimuovere completamente l'elemento ObjectDataProvider poiché si stanno creando i dati nel codice.

+0

ma non dovrei implementare il tipo di oggetto? – cemregoksu

+0

@cemregoksu: Non sono sicuro di cosa intendi con 'implementare il tipo di oggetto'. Non è necessario fornire a WPF alcun tipo di informazione; lo leggerà dal tipo di runtime dell'oggetto. ObjectDataProvider viene utilizzato se si desidera creare un oggetto in XAML utilizzando una chiamata al metodo o fornendo parametri del costruttore. Dato che hai già un oggetto, puoi semplicemente assegnarlo a ItemsSource. – Quartermeister