2010-08-08 5 views
11

Parece que no es posible enlazar la propiedad de visibilidad de una DataGridTemplateColumn en Silverlight 4 todavía. Hice algunas búsquedas en Google y parece que hay algunas publicaciones que sugieren que era para hacer with the fact that it was not a DependencyObject y cómo this would change in SL4, pero no parece ser el caso.¿Por qué no puedo vincular Visiblity de DataGridTemplateColumn en Silverlight 4?

Para solucionarlo, lo hago en el código detrás del evento cargado en la cuadrícula de datos, pero tengo curiosidad de por qué este es el caso?

Aquí está el mensaje de error que consigo (con un convertidor que devuelve un valor de visibilidad):

{System.ArgumentException: Object of type 'System.Windows.Data.Binding' cannot be converted to type 'System.Windows.Visibility'. 
    at System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast) 
    at System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr) 
    at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) 
    at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index) 
    at MS.Internal.XamlMemberInfo.SetValue(Object target, Object value) 
    at MS.Internal.XamlManagedRuntimeRPInvokes.SetValue(XamlTypeToken inType, XamlQualifiedObject& inObj, XamlPropertyToken inProperty, XamlQualifiedObject& inValue)} 

Respuesta

12

Mientras que el DataGridTemplateColumn no se derivan de DependencyObject no define un DependencyProperty por su propiedad Visibility. De hecho, no define ninguna propiedad de dependencia, por lo que aún no puede obtener nada para enlazarlo.

+0

Gracias por su ayuda como siempre Anthony. – Rodney

+0

Tan frustrante. –

+0

De acuerdo. Hopefull MS hace estas propiedades de dependencia en el futuro. –

7

utilizar esto para cualquier propiedades que desee unirse a, en la columna de la plantilla de cuadrícula de datos:

public class CustomDataGridTemplateColumn : DataGridTemplateColumn 
{ 
    public static readonly DependencyProperty VisibilityBindingProperty = DependencyProperty.Register(
     "VisibilityBinding", typeof(Visibility), typeof(CustomDataGridTemplateColumn), new PropertyMetadata(Visibility.Collapsed, new PropertyChangedCallback(OnVisibilityChanged))); 

    public Visibility VisibilityBinding 
    { 
     get { return (Visibility)this.GetValue(VisibilityBindingProperty); } 
     set { this.SetValue(VisibilityBindingProperty, value); } 
    } 

    private static void OnVisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ((CustomDataGridTemplateColumn)d).Visibility = (Visibility)e.NewValue; 
    } 
} 
+0

Gracias por una buena solución. :) –

+1

Hola @JohnySkovdal y StuartBale: Esto se ve muy bien, pero estoy tratando de usar esto (sin éxito) y me preguntaba si me faltaba algo más, por ejemplo. ¿hay algo especial necesario en la vinculación definida en el XAML? ¿Se está vinculando al ViewModel o al DataContext de la fila/ItemsSource? –

+0

@JoeL. De hecho, terminé yendo por otra ruta, ya que también tuve muchos problemas, pero no estoy 100% seguro de que estuvieran relacionados con esta solución, así que realmente no puedo ayudarte allí. Mi problema era bastante más complejo, así que terminé creando las plantillas en el código y luego no agregué la columna si no se mostraba. –

Cuestiones relacionadas