为什么我无法在Silverlight 4中绑定DataGridTemplateColumn的可见性?

11
似乎在Silverlight 4中仍然无法绑定DataGridTemplateColumn的可见性属性。我进行了一些搜索,有几篇帖子建议这与它不是DependencyObject有关,以及这在SL4中会改变,但这似乎并不是事实。为了解决这个问题,我在datagrid加载事件的代码后台中处理它,但我很好奇为什么会这样?以下是我收到的错误消息(使用返回Visibility值的转换器):
{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)}
2个回答

12

虽然 DataGridTemplateColumn 继承自 DependencyObject,但它没有为其可见性属性定义 DependencyProperty。事实上,它没有定义任何依赖属性,因此您仍然无法在其上绑定任何内容。


感谢您一如既往的帮助,安东尼。 - Rodney
同意。希望微软将来能够使这些依赖属性成为可能。 - Matt Ruwe
жӮЁеҸҜд»ҘдҪҝз”ЁDataGridContextHelperйқҷжҖҒзұ»жқҘејәеҲ¶ж•°жҚ®дёҠдёӢж–Үи§ҰеҸ‘дҫқиө–еұһжҖ§жӣҙж”№гҖӮ - SliverNinja - MSFT

7

如果您想要绑定任何属性到数据网格模板列,请使用以下内容:

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;
    }
}

1
嘿@JohnySkovdal和StuartBale:这看起来很棒,但我正在尝试使用它(不成功),想知道是否还有其他我需要注意的地方,例如在XAML中定义的绑定是否需要特殊设置?您是将其绑定到ViewModel还是行/ItemsSource的DataContext? - Joe L.
@JoeL。实际上,我最终采取了另一种方法,因为我也遇到了很多问题,但我不确定它们是否与这个解决方案有关,所以我无法真正帮助你。我的问题相当复杂,所以我最终在代码后端创建了模板,然后如果不需要显示该列,则不添加该列。 - Johny Skovdal
谢谢!那是一个很棒的解决方案。 - Ichibanpanda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接