2010-08-08 2 views
11

Es scheint, dass es nicht möglich ist, die Sichtbarkeitseigenschaft einer DataGridTemplateColumn in Silverlight 4 noch zu binden. Ich habe ein wenig gegoogelt und es gibt ein paar Posts, die darauf hindeuten, dass es with the fact that it was not a DependencyObject und wie this would change in SL4 zu tun ist, aber es scheint nicht der Fall zu sein.Warum kann ich die Visibility einer DataGridTemplateColumn in Silverlight 4 nicht binden?

Um es zu umgehen, ich mache es in den Code hinter dem Datagrid geladenen Ereignis, aber ich bin neugierig, warum dies der Fall ist? Hier

ist die Fehlermeldung I (mit einem Konverter, der einen Visibility-Wert zurückgibt) erhalten:

{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)} 

Antwort

12

Während die DataGridTemplateColumn sich ableiten von DependencyObject es keine DependencyProperty für seine Eigenschaft Sichtbarkeit definieren. Tatsächlich definiert es keine Abhängigkeitseigenschaften, daher können Sie immer noch nichts binden.

+0

Vielen Dank für Ihre Hilfe, wie immer Anthony. – Rodney

+0

So frustrierend. –

+0

Einverstanden. Hopefull MS macht diese Abhängigkeitseigenschaften in der Zukunft. –

7

verwenden für alle Eigenschaften, die Sie binden möchten, auf dem Data Grid Template Säule:

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

Vielen Dank für einen wirklich guten Workaround. :) –

+1

Hey @JohnySkovdal und StuartBale: Das sieht gut aus, aber ich versuche das (erfolglos) zu benutzen und habe mich gefragt, ob da noch was anderes fehlt, zB. Gibt es etwas Besonderes in der Bindung im XAML definiert? Sind Sie mit dem ViewModel oder dem DataContext der Zeile/ItemsSource verbunden? –

+0

@JoeL. Letztendlich habe ich einen anderen Weg eingeschlagen, da ich auch viele Probleme hatte, aber ich bin nicht 100% sicher, dass sie mit dieser Lösung in Verbindung standen, also kann ich Ihnen dort nicht wirklich helfen. Mein Problem war ein bisschen komplexer, so dass ich die Vorlagen im Code hinterlegte und dann die Spalte nicht hinzufügte, wenn sie nicht angezeigt werden sollte. –

Verwandte Themen