如何使 Silverlight 自定义控件的属性数据可绑定?

Posted

技术标签:

【中文标题】如何使 Silverlight 自定义控件的属性数据可绑定?【英文标题】:How to make a Silverlight Custom Control's property data-bindable? 【发布时间】:2010-10-29 14:39:05 【问题描述】:

我创建了一个自定义 silverlight 控件,它由两个日期选择器和一个组合框组成。我想让组合框数据可绑定,并且我知道我需要使用 DependencyProperty。我不确定的是如何构建它。这是我的代码:

#region ItemsSource (DependencyProperty)

    /// <summary>
    /// ItemsSource to bind to the ComboBox
    /// </summary>
    public IList ItemsSource
    
        get  return (IList)GetValue(ItemsSourceProperty); 
        set  SetValue(ItemsSourceProperty, value); 
    
    public static readonly DependencyProperty ItemsSourceProperty =
        DependencyProperty.Register("ItemsSource", typeof(int), typeof(DateRangeControl),
          new PropertyMetadata(0));

    #endregion

问题是我看到的所有示例都是针对文本或背景等简单属性的,它们需要字符串、整数或颜色。由于我试图绑定到组合框 ItemsSource,它需要一个 IEnumerable,我不知道如何为此构建属性。我使用了 IList。

如果我在正确的道路上,有人可以告诉我并给我一些指示吗?谢谢

【问题讨论】:

【参考方案1】:

我发现您发布的代码有问题。实例访问者和你注册 DP 时定义的类型需要一致。如果您将 typeof(int) 更改为 typeof(IList),您现有的代码应该可以工作。

但通常最佳做法是使用满足属性要求的最低级别的类型。基于此,如果您想创建集合属性,请使用 IEnumerable,除非您确实需要 IList 提供的功能。

【讨论】:

【参考方案2】:

你不能用这个吗?

        public IEnumerable ItemsSource
    
        get
        
            return (IEnumerable)GetValue(ItemsSourceProperty);
        
        set
        
            SetValue(ItemsSourceProperty, value);
        
    

    public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(DateRangeControl), new PropertyMetadata(null));

IEnumerable 可以在 System.Collections.Generic 中找到

【讨论】:

当我这样做时,根本不会调用 get 和 set。 get 和 set 不需要被调用。属性的实际值自动存储在其他位置。这就是为什么在属性内部使用 GetValue 和 SetValue 来从 DependancyProperty 系统存储它的位置检索值。

以上是关于如何使 Silverlight 自定义控件的属性数据可绑定?的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight 4:如何切换控件可见性

在 XAML 中调用时,如何使我的自定义依赖项属性排序到顶部?

将 Silverlight UserControl 自定义属性绑定到其元素

如何使我的 ASP.NET 服务器控件将嵌入的代码块作为属性值?

我生成了一个换行的自定义Label控件,如何取得该行数啊??

如何使自定义 GUI 控件对屏幕阅读器可见?