2011-05-08 10 views
5

En Silverlight 4, la propiedad IsReadOnly de DataGridTextColumn parece no tener propiedad de dependencia. Por lo tanto, no podría vincularlo a una propiedad en el modelo de vista.DataGridTextColumn - Cómo enlazar IsReadonly?

Parece que la única alternativa es usar un DataTemplate, pero incluso aquí estoy frente a dos problemas principales:

<sdk:DataGrid Style="{StaticResource DataGridStyle}" x:Name="call_dataGrid" ItemsSource="{Binding Calls}"> 
        <sdk:DataGrid.Columns> 
         <sdk:DataGridTextColumn Header="Call Time" Binding="{Binding Path=CallTime}" /> 
         <sdk:DataGridTemplateColumn Header="Call Date"> 
          <sdk:DataGridTemplateColumn.CellEditingTemplate> 
           <DataTemplate> 
            <TextBox Text="{Binding Path=CallDate}" IsReadOnly="{Binding Path=DataContext.IsInEditMode, ElementName=call_dataGrid, Converter={StaticResource NegationConverter}}"/> 
           </DataTemplate> 
          </sdk:DataGridTemplateColumn.CellEditingTemplate> 
         </sdk:DataGridTemplateColumn> 

Parece que no puedo editar una plantilla de DataGridTextColumn y tienen que utilizar en su lugar como se ve DataGridTemplateColumn encima. Sin embargo, esto anula todos los estilos que había definido previamente dentro de DataGridStyle. My Column ni siquiera tiene el marcador de fila y parece totalmente ajeno al resto de las celdas.

El segundo problema es que todavía no funciona como se esperaba. El cuadro de texto dentro de esa plantilla todavía no está configurado para solo leer. ¿Qué estoy haciendo mal aquí?

Apreciamos mucho su ayuda en esto,

actualización

Después de la respuesta prometedora a continuación He ajustado el código todavía sin éxito.

que han cambiado de devolución de llamada de la DP a la siguiente

public class IsReadOnlyDpAttachable 
    { 
     public static void SetIsReadXOnly(DependencyObject obj, bool isReadOnly) 
     { 
      obj.SetValue(IsReadXOnlyProperty, isReadOnly); 
     } 

     public static bool GetIsReadXOnly(DependencyObject obj) 
     { 
      return (bool)obj.GetValue(IsReadXOnlyProperty); 
     } 

     public static readonly DependencyProperty IsReadXOnlyProperty = 
      DependencyProperty.RegisterAttached("IsReadXOnly", typeof(bool), typeof(IsReadOnlyDpAttachable), new PropertyMetadata(false, Callback)); 

     private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      ((DataGrid)d).IsReadOnly = (bool)e.NewValue; 
     } 
    } 

y establecer la DP sobre sí mismo IsReadOnly de la cuadrícula de datos, funciona perfectamente bien, pero de nuevo aquí, no sería necesario ya que el IsReadOnly aquí es ya es un Dp y se puede enlazar fácilmente de todos modos. Pero la prueba muestra el Dp funciona bien:

<sdk:DataGrid PrismExt:IsReadOnlyDpAttachable.IsReadXOnly="{Binding IsInEditMode, Mode=TwoWay, Converter={StaticResource NegationConverter}}" Style="{StaticResource DataGridStyle}" CanUserReorderColumns="True" x:Name="call_dataGrid" AutoGenerateColumns="False" ItemsSource="{Binding Calls}"> 

Sin embargo, el momento en que intento utilizar la DP en el DataGridTextColumn subyacente, que no hace nada:

<Grid x:Name="LayoutRoot"> 
<sdk:DataGrid Style="{StaticResource DataGridStyle}" CanUserReorderColumns="True" x:Name="call_dataGrid" AutoGenerateColumns="False" ItemsSource="{Binding Calls}"> 
        <sdk:DataGrid.Columns>       
         <sdk:DataGridTextColumn Header="Call Time" Binding="{Binding Path=CallTime}" PrismExt:IsReadOnlyDpAttachable.IsReadXOnly="{Binding DataContext.IsInEditMode, ElementName=LayoutRoot, Mode=TwoWay, Converter={StaticResource NegationConverter}}"/> 
        </sdk:DataGrid.Columns> 
</sdk:DataGrid> 
</Grid> 

Alguna idea?

Respuesta

7

lo que puede hacer es crear una propiedad adjunta para controlar el cambio de la propiedad IsReadOnly en DataGridTextColumn.

public class Class1 
{ 
    public static void SetIsReadOnly(DependencyObject obj, bool isReadOnly) 
    { 
     obj.SetValue(IsReadOnlyProperty, isReadOnly); 
    } 

    public static bool GetIsReadOnly(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(IsReadOnlyProperty); 
    } 

    // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty IsReadOnlyProperty = 
     DependencyProperty.RegisterAttached("IsReadOnly", typeof(bool), typeof(Class1), new PropertyMetadata(false, Callback)); 

    private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ((DataGridTextColumn)d).IsReadOnly = (bool)e.NewValue; 
    } 
} 

En su xaml, puede utilizar la propiedad adjunta en su lugar.

<sdk:DataGridTextColumn local:Class1.IsReadOnly="True" Binding="{Binding Property1}" Header="Property1"/> 

Espero que esto ayude. :)

actualización

Una vez que tenga la clase DataContextProxy, hacer

 <sdk:DataGridTextColumn Binding="{Binding Name}" 
           local:Class1.IsReadOnly="{Binding DataSource.IsInEditMode, Source={StaticResource DataContextProxy}, Converter={StaticResource xxxConverter}}" 
           Header="ReadOnly Header" /> 
+0

TRUE, acaba de actualizar la respuesta .;) –

+0

Muchas Gracias por su respuesta. Sin embargo, aunque funciona un verdadero o falso normal, todavía no puedo utilizar el enlace de esta manera: Houman

+0

¿Puedes poner un breakput en tu NegationConverter y ver si se llama? –

Cuestiones relacionadas