Domanda

Situazione:

Ho creato un DataGrid in XAML e ItemsSource è associato a un oggetto ObservableCollection di una determinata classe che contiene proprietà. Quindi in C #, creo un DataGridTextColumn e un DataGridComboBoxColumn e li associo alle proprietà degli oggetti all'interno di ObservableCollection. Posso associare DataGridComboBoxColumn a una raccolta semplice, ma ciò che voglio fare è associarlo a una raccolta di raccolte di stringhe in modo che per ogni riga il ComboBox all'interno di DataGrid abbia una raccolta diversa di stringhe. Non sono riuscito a farlo ...

Domanda:

Come posso associare DataGridCombBoxColumn in modo da poter avere una raccolta diversa di stringhe per ogni riga di questo tipo di colonna?

Esempio di codice:

XAML:

<Window>
  <!-- ... -->
  WPFToolkit:DataGrid
           x:Name="DG_Operations"
           Margin="10,5,10,5" 
           Height="100" 
           HorizontalAlignment="Stretch" 
           FontWeight="Normal" 
           ItemsSource="{Binding Path=OperationsStats}"
           AlternatingRowBackground="{DynamicResource SpecialColor}" 
           HorizontalScrollBarVisibility="Auto" 
           VerticalScrollBarVisibility="Visible" 
           SelectionMode="Extended"
           CanUserAddRows="False" 
           CanUserDeleteRows="False"
           CanUserResizeRows="True" 
           CanUserSortColumns="True"
           AutoGenerateColumns="False" 
           IsReadOnly="False" 
           IsEnabled="True"
           BorderThickness="1,1,1,1" 
           VerticalAlignment="Stretch"/>
  <!-- ... -->
</Window>

C #:

public class DataModelStatsOperations
{
   public ObservableCollection<IStatsOperation> OperationsStats { get; set; }
}

public interface IStatsOperation
{
   string Operation { get; set; }
   Collection<string> Data{ get; set; }
}

public class StatsOperation : IStatsOperation
{
    public StatsOperation(string operation, Collection<string> data)
    {
        Operation = operation;
        Data = data;
    }
    public string Operation { get; set; }
    public Collection<string> Data{ get; set; }
}

private ObservableCollection<IStatsOperation> dataOperations_ =
        new ObservableCollection<IStatsOperation>();

//...
 Binding items = new Binding();
 PropertyPath path = new PropertyPath("Operation");
 items.Path = path;
 DG_Operations.Columns.Add(new DataGridTextColumn()
 {
     Header = "Operations",
     Width = 133,
     Binding = items
  });
  DG_Operations.Columns.Add(new DataGridComboBoxColumn()
  {
     Header = "Data",
     Width = 190,
     ItemsSource = /*???*/,
     SelectedValueBinding = new Binding("Data"),
     TextBinding = new Binding("Data")
  });
dataOperations_.Add(new StatsOperation(CB_Operation.SelectedItem.ToString(),
                                                           dataCollection));
DG_Operations.DataContext = new DataModelStatsOperations
{
    OperationsStats = dataOperations_
};
//...

Qualsiasi aiuto sarebbe molto apprezzato!

Note:

Ok, quindi dopo aver letto le prime due risposte ho notato qualcosa. La mia associazione non è proprio giusta! Ora, quello che voglio fare è qualcosa di simile a quello che AndyG ha proposto:

DG_Operations.Columns.Add(new DataGridComboBoxColumn()
{
    Header = "Data",
    Width = 190,
    ItemsSource = new Binding("Data"), //notice this here does not work (have a look at the following error)
    SelectedValueBinding = new Binding("Operation"),
    TextBinding = new Binding("Operation")
});

Errore: " Impossibile convertire implicitamente il tipo 'System.Windows.Data.Binding' in 'System.Collections.IEnumerable'. "

In che modo l'origine articoli può essere associato ai dati?

È stato utile?

Soluzione

In primo luogo, questo dovrebbe essere facile ... in secondo luogo, perché stai costruendo (e vincolando) le colonne in C #? Eek.

XAML (sto usando una griglia normale perché sono pigro):

<ListView Name="MyListView">
    <ListView.View>
        <GridView>

            <GridView.Columns>

                <GridViewColumn DisplayMemberBinding="{Binding Operation}" />

                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding Choices}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

            </GridView.Columns>

        </GridView>
    </ListView.View>
</ListView>

C # :

void Window1_Loaded(object sender, RoutedEventArgs e)
{
    var dahList = new List<StatsOperation>();

    dahList.Add(new StatsOperation
    {
        Operation = "Op A",
        Choices = new string[] { "One", "Two", "Three" },
    });

    dahList.Add(new StatsOperation
    {
        Operation = "Op B",
        Choices = new string[] { "4", "5", "6" },
    });

    this.MyListView.ItemsSource = dahList;
}

I risultati:

Griglia WPF con opzioni di casella combinata dinamica http: // www.singingeels.com/Articles/Articles/UserImage.aspx?ImageID=b1e3f880-c278-4d2b-bcc2-8ad390591200

Altri suggerimenti

Penso che l'errore sia dovuto al modo in cui hai eseguito l'associazione. Quando si definisce una colonna, l'associazione è correlata all'oggetto rappresentato da una riga specifica. Quindi, per quanto ho capito, hai un StatsOperation per ogni riga, quindi la colonna TextBox è vincolata al funzionamento, ed è così che hai, e la colonna ComboBox ItemsSource dovrebbe essere associata a una raccolta. In questo momento sembra che sia legato a un Collection<Collection<string>>.

Non ho definito le colonne in code-behind prima, quindi ecco un esempio in XAML. Ho scoperto che a volte ComboBoxColumn può essere complicato, quindi ho mostrato come puoi avere una casella combinata nella colonna usando TemplateColumn o ComboBoxColumn. Ho copiato il mio codice incollato, quindi sostituisci 'dg' con 'WPFToolkit' nel tuo caso:

<dg:DataGrid
      ...
      ...>
      <dg:DataGrid.Columns>
            <dg:DataGridTextColumn Binding="{Binding Operation}" CanUserReorder="True" CanUserResize="True" Header="Operation" />
            <dg:DataGridTemplateColumn CanUserReorder="True" CanUserResize="True" Header="Template Column">
                <dg:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Data}" SelectedItem="{Binding Operation}" />
                    </DataTemplate>
                </dg:DataGridTemplateColumn.CellTemplate>
            </dg:DataGridTemplateColumn>
            <dg:DataGridComboBoxColumn
                Header="ComboBox Column"                                                                                    
                 SelectedValueBinding="{Binding Operation}"                     
                 SelectedItemBinding="{Binding Operation}">
                <dg:DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="IsSynchronizedWithCurrentItem" Value="False" />
                        <Setter Property="ItemsSource" Value="{Binding Data}" />
                    </Style>
                </dg:DataGridComboBoxColumn.ElementStyle>
                <dg:DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Data}" />
                        <Setter Property="IsDropDownOpen" Value="True" />
                    </Style>
                </dg:DataGridComboBoxColumn.EditingElementStyle>
            </dg:DataGridComboBoxColumn>
      </dg:DataGrid.Columns>

</dg:DataGrid>

Suppongo che Operazione sia l'elemento selezionato, Dati sia gli elementi da selezionare e che DataGrid sia associato a una raccolta di StatsOperation. Buona fortuna!

Per correggere il tuo errore di associazione degli articoli, utilizza il modulo:

BindingOperations.SetBinding(new DataGridComboBoxColumn(), DataGridComboBoxColumn.ItemsSourceProperty, new Binding("Data"));

Ovviamente non puoi farlo nell'intializer, quindi dovrai spostare un po 'le tue dichiarazioni ma questo dovrebbe occuparsi di quell'errore nel tuo aggiornamento.

MODIFICA Mi dispiace, sono un po 'lento a mezzanotte :). Ecco una risposta aggiornata. Sembra un grande articolo di Vincent Sibal WPF DataGrid - DataGridComboBoxColumn v1 Intro risponde alla tua domanda. Lo fa?

Parziale - Penso che ci sia confusione in quello che stai dicendo. Hai detto che hai bisogno di una raccolta di raccolte di stringhe in ogni riga in modo che la casella combinata possa mostrare stringhe diverse per righe diverse. Tuttavia, affinché una casella combinata mostri un set di stringhe, devi solo una raccolta di stringhe, per riga, non una raccolta di stringhe.

Ora poiché hai bisogno della raccolta di stringhe per riga potresti pensare che avresti bisogno di una raccolta di stringhe.

La mia comprensione della tua domanda è corretta? In tal caso, la tua menzione della raccolta della raccolta di stringhe è errata.

Ciò di cui hai effettivamente bisogno è una raccolta di StatOperations in cui ogni StatOperation dovrebbe avere una raccolta di stringhe. Questo è esattamente quello che hai avuto, come mostrato nelle lezioni precedenti.

Per fare progressi, ti suggerisco di modificare la tua domanda e di indicare esattamente dove eri bloccato dopo aver corretto l'associazione come suggerito da AndyG.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top