2010-07-11 11 views
18

Si creo un enlace a la propiedad IsReadOnly del DataGridTextColumn, no se actualiza. Si lo configuro a través de marcado, funciona..NET v4 DataGridTextColumn.IsReadOnly parece estar defectuoso

<DataGridTextColumn IsReadOnly="{Binding IsReferenceInactive}"/> <!-- NOP --> 

<DataGridTextColumn IsReadOnly="True"/> <!-- Works as expected, cell is r/o --> 

La propiedad es un IsReferenceInactive DP y funciona bien (Para propósitos de prueba que he obligado a una casilla de verificación, que funcionó)

¿Es esta una limitación conocida?

actualización

Uups, excepto que escribí, hay un mensaje en la ventana de salida:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=IsReferenceInactive; DataItem=null; target element is 'DataGridTextColumn' (HashCode=23836176); target property is 'IsReadOnly' (type 'Boolean') 

parece ser éste:

http://connect.microsoft.com/VisualStudio/feedback/details/530280/wpf-4-vs2010-datagrid-isreadonly-does-not-work-with-binding-to-boolean-property

Respuesta

11

DataGridColumn s no son parte del árbol visual, y no participan en el enlace como este . La forma en que lo soluciono es usar DataGridTemplateColumn.

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=myProperty}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox IsEnabled="{Binding Path=myBool}" Text="{Binding Path=myProperty Mode=TwoWay}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 

Existen otras soluciones, que me parecen un poco hackish, pero funcionan; a saber: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

+0

Ok, finalmente lo comenté también. No me he visto lo suficientemente bien en la ventana de salida. Lo siento, lo publiqué rápido. Pero no eliminaré la pregunta, quizás ayude a alguien que también tenía prisa :) – HCL

+1

No hay problema; da más forraje para Google/Bing para encontrar la respuesta correcta cuando se hacen preguntas en SO. – codekaizen

25

Igual que codekaizen pero más simple:

<DataGridTextColumn> 
    <DataGridTextColumn.CellStyle> 
    <Style> 
     <Setter Property="UIElement.IsEnabled" Value="{Binding IsEditable}" /> 
    </Style> 
    </DataGridTextColumn.CellStyle> 
</DataGridTextColumn> 
0

la unión del DataGridTextColumn funciona sólo para la propiedad de texto, pero no para las otras propiedades de DataGridTextColumn.

Solución: DataGridTextColumn le dice al DataGrid que cree un TextBlock para cada fila y esa columna. Puede definir un estilo para TextBlock y vincular el Estilo con Style.Key al TextBlock de esa columna (ElementStyle).

Por supuesto, el TextBlock necesita ahora encontrar el objeto del datalist. Puede hacerlo con una vinculación de RelativeSource con AncestorType = DataGridRow. El DataGridRow luego proporciona acceso al objeto.

Algo como esto:

<Window.Resources> 
    <Style x:Key="IsReadOnlyStyle" TargetType="TextBlock"> 
    <Setter Property="IsReadOnly" 
     Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, 
     Path =Item.NoOutput/> 
    </Style> 
</Window.Resources> 

<DataGrid> 
    <DataGrid.Columns> 
    <DataGridTextColumn Header="Value" Width="*" Binding="{Binding Value}" ElementStyle="{StaticResource IsReadOnlyStyle}"/> 
</DataGrid.Columns> 

complicado ¿verdad?Te recomiendo que lea mi artículo detallada sobre el formato de cuadrícula de datos en: http://www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings?msg=5037235#xx5037235xx

Buena suerte, que lo necesitan :-)

+0

Esta solución no funciona. TextBlock no tiene una propiedad IsReadOnly. TextBox tiene esa propiedad, pero solo se puede usar con EditingElementStyle, que produce resultados visualmente diferentes. –

0

Si te gusta la solución de @ codekaizen pero tendrá el aspecto de un cuadro de texto con discapacidad, entonces este hará el truco:

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBox IsEnabled="{Binding Path=myBool}" Text="{Binding Path=myProperty}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox IsEnabled="{Binding Path=myBool}" Text="{Binding Path=myProperty, Mode=TwoWay}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 
3

me encontré con esta solución que le permite enlazar a los datos cuando el DataContext no se hereda: http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

Añadir t que BindingProxy clase Thomas escribió y añadir este recurso para su DataGrid:

<DataGrid.Resources> 
    <local:BindingProxy x:Key="proxy" Data="{Binding}" /> 
</DataGrid.Resources> 

Ahora usted puede unirse a su DataContex través de la propiedad de la DataBindingProxy simplemente como era de esperar.

<DataGridTextColumn Header="Price" 
        Binding="{Binding Price}" 
        IsReadOnly="{Binding Data.LockFields, Source={StaticResource proxy}}"/> 
Cuestiones relacionadas