WPF DataGrid cambia il modello tra la modalità di visualizzazione e la modalità di modifica

StackOverflow https://stackoverflow.com/questions/944939

  •  09-09-2019
  •  | 
  •  

Domanda

Se hai un WPF DataGrid a sinistra di una Finestra con un'area a destra per la visualizzazione del record selezionato.Il record selezionato è composto da Textboxes e ComboBoxes che sono disabilitati finché non si fa clic sul pulsante di modifica.Tutto funziona come previsto.

Tuttavia, sembra un po’ goffo popolarlo ComboBoxes quando il SelectedItem del DataGrid essere cambiato.Un controllo molto più leggero come a TextBlock potrebbe essere utilizzato finché non si fa clic sul pulsante Modifica, quindi il file TextBlocks potrebbe essere sostituito ComboBoxes.

Sono sicuro che questo possa essere fatto con una sorta di modello, ma quando ho provato a sperimentarlo, tutti gli eventi associati al ComboBoxsegnalano un errore in quanto non sono più presenti in quanto sono stati sostituiti con TextBlock in "Modalità di visualizzazione".

Probabilmente sto sbagliando, quindi qualche consiglio sarebbe apprezzato.

È stato utile?

Soluzione

qui è eccellente articolo

Per applicare la modifica con un solo clic a tutte le celle nel DataGrid

  1. Incolla lo stile seguente nelle Risorse del tuo DataGrid
  2. Incolla il metodo nel code-behind

Per applicare la modifica con un solo clic solo a determinate celle nel DataGrid

  1. Imposta un x:Key sullo stile (es.)
  2. Incolla lo stile nelle Risorse del tuo DataGrid
  3. Applica lo stile alla proprietà CellStyle delle colonne che desideri modificare con un solo clic (es.)
  4. Incolla il metodo nel code-behind

    //
    // SINGLE CLICK EDITING
    //
    private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        DataGridCell cell = sender as DataGridCell;
        if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
        {
            if (!cell.IsFocused)
            {
                cell.Focus();
            }
            DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
            if (dataGrid != null)
            {
                if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                {
                    if (!cell.IsSelected)
                        cell.IsSelected = true;
                }
                else
                {
                    DataGridRow row = FindVisualParent<DataGridRow>(cell);
                    if (row != null && !row.IsSelected)
                    {
                        row.IsSelected = true;
                    }
                }
            }
        }
    }    
    
    static T FindVisualParent<T>(UIElement element) where T : UIElement
    {
        UIElement parent = element;
        while (parent != null)
        {
            T correctlyTyped = parent as T;
            if (correctlyTyped != null)
            {
                return correctlyTyped;
            }
    
            parent = VisualTreeHelper.GetParent(parent) as UIElement;
        }
        return null;
    } 
    

Altri suggerimenti

La proprietà ContentTemplateSelector dovrebbe consentire di selezionare un modello o un altro a seconda della modalità corrente (visualizzazione/modifica)

Il collegamento della risposta contrassegnato è morto.

Questo può invece aiutare:http://wpf.codeplex.com/wikipage?title=Modifica con un solo clic%20

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