2010-01-25 7 views
6

Quiero ser capaz de elegir una celda específica en un DataGrid de Silverlight 3.0 y ponerla en modo de edición. Puedo usar el VisualTreeManager para ubicar la celda. ¿Cómo cambio al modo de edición?¿Cómo puedo colocar un DataGridCell de Silverlight 3 en modo de edición en el código?

Cada DataGridCell es la siguiente con el VisualTreeManager:

  System.Windows.Controls.DataGridCell 
      System.Windows.Controls.Grid 
       System.Windows.Shapes.Rectangle 
       System.Windows.Controls.ContentPresenter 
       System.Windows.Controls.TextBlock 
       System.Windows.Shapes.Rectangle 
       System.Windows.Shapes.Rectangle 

con TextBlock que contiene el texto que desea editar.

actualización

Siguiendo la sugerencia @AnthonyWJones', así es como he tratado de hacer esto utilizando BeginEdit().

Quería hacerlo simple, así que pensé que elegiría una columna en la primera fila. ¡Incluso eso probó más allá de mi conocimiento de SL! Al final, me sale la primera fila mediante la creación de un campo llamado FIRSTROW para sostenerlo:

private DataGridRow firstRow; 

añade un manejador LoadingRow a la cuadrícula de datos:

LoadingRow="computersDataGrid_LoadingRow" 

y

private void computersDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    if (this.firstRow == null) 
     this.firstRow = e.Row; 
} 

y luego agregar un botón al panel para activar la edición:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    this.dataGrid.SelectedItem = this.firstRow; 
    this.dataGrid.CurrentColumn = this.dataGrid.Columns[4]; 
    this.dataGrid.BeginEdit(); 
} 

Hago clic en el botón y se selecciona la celda correcta pero no se edita en la celda. Se necesita un clic manual para lograrlo.

Respuesta

2

No estoy seguro de por qué necesita encontrar el DataGridCell utilizando VisualTreeManager ni sé cómo empezará a editar correctamente. Puede salirse con la suya simplemente configurando el estado visual de la celda para su edición.

VisualStateManager.GoToState(myDataGridCell, "Editing", true); 

No estoy seguro de cómo se comporta la grilla cuando haces algo como lo anterior. Es posible que las cosas se vean un poco peras si necesita DataGrid para ayudarlo a revertir los cambios en una fila.

El enfoque "estándar" sería la de establecer la propiedad DataGridSelectedItem al elemento representado por la fila, establecer la propiedad CurrrentColum al objeto DataGridColumn que representa a la columna en la que se encuentra la célula. Luego llame al método BeginEdit.

+0

que había sido llevado por este camino por otra persona. Voy a probar lo que has sugerido y dejarte saber. Gracias. – ssg31415926

+0

He intentado ambas sugerencias sin éxito. Primero, el enfoque "estándar". El uso de SelectedItem y CurrentColumn hace que la celda se resalte, pero agregar BeginEdit() no tiene ningún efecto. La celda no obtiene el foco y no entra en modo de edición. El uso de VisualStateManager tampoco funcionó. – ssg31415926

+0

@ ssg31415926 Sospeché que el primer enfoque no funcionaría, me sorprende que el segundo no lo haya hecho, ¿puede editar su pregunta para incluir una pequeña cantidad de código relevante que describa cómo lo ha intentado? – AnthonyWJones

0

no soy capaz de entender su problema correctamente, pero tuve un problema similar

quería hacer sólo algunas de las celdas de la cuadrícula editable y resto no lo eran. En lugar de crear una lógica y asignar ReadOnly como verdadero/falso, hice lo simple.

  • marcar las células de toda la cuadrícula se pueden escribir, IsReadOnly como falso
  • Establecer el evento PreparingCellForEdit y enviar una devolución de llamada
  • Al hacer doble clic en una celda, se pone en el modo de edición
  • Compruebe si esta celda que quiere ser editable
  • Si se le permite ser editado, adelante
  • Si esa celda es de sólo lectura, a continuación, llamar CancelEdit

El código de ejemplo es como sigue

namespace foo 
{ 
    public class foobar 
    { 
     public foobar() 
     { 
      sampleGrid = new DataGrid(); 
      sampleGrid.IsReadOnly = false; 
      sampleGrid.PreparingCellForEdit += new EventHandler<DataGridPreparingCellForEditEventArgs>(sampleGrid_PreparingCellForEdit); 
     } 

     void sampleGrid_PreparingCellForEdit(object sender, DataGridsampleGrid_PreparingCellForEditEventArgs e) 
     { 
      if (sampleGrid.SelectedItem != null) 
      { 
       bool isWritableField = CheckIfWritable() 

       if (isWritableField == false) 
       { 
        sampleGrid.CancelEdit(); 
       } 

       // continue with your logic 
      } 
     } 

     private DataGrid sampleGrid; 
    } 
} 
+0

¿Alguna idea de por qué CancelEdit podría no funcionar? – neurotix

+0

@neurotix No funciona? De Verdad? Lo hace por mi Silverlight 3. No creo que esto deba cambiar para SL4 –

+0

No da ningún efecto en absoluto para mí :(. También intenté lograr lo mismo que hiciste aquí cambiando IsReadOnly Dinamically pero que también falla aleatoriamente. Si cuidado de verificar: http://stackoverflow.com/questions/9311158/datagrid-column-isreadonly-property-not-working-in-silverlight-4 – neurotix

Cuestiones relacionadas