WPF依赖项属性优先级和引用类型默认值

前端之家收集整理的这篇文章主要介绍了WPF依赖项属性优先级和引用类型默认值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我创建这样的自定义控件:
public class MyControl : ContentControl
{
   public static readonly DependencyProperty ItemsProperty =               
         DependencyProperty.Register(
                "Items",typeof(ObservableCollection<object>),typeof(MyControl),new PropertyMetadata(null));

   public MyControl()
   {   
       // Setup a default value to empty collection
       // so users of MyControl can call MyControl.Items.Add()
       Items = new ObservableCollection<object>();
   }

   public ObservableCollection<object> Items
   { 
      get { return (ObservableCollection<object>)GetValue(ItemsProperty); } 
      set { SetValue(ItemsProperty,value); } 
   } 
}

然后允许用户在Xaml中绑定它,如下所示:

<DataTemplate>
    <MyControl Items="{Binding ItemsOnviewmodel}"/>
</DataTemplate>

然后绑定永远不会起作用!这是由于Dependency Property Precedence,它将CLR Set值置于模板绑定之上!

所以,我理解为什么这不起作用,但我想知道是否有解决方案.对于只想以编程方式添加Items的MyControl的懒惰使用者,可以为新的ObservableCollection提供ItemsProperty的默认值,同时允许My Control的MVVM高级用户通过DataTemplate绑定到同一属性吗?

这适用于Silverlight& WPF.风格中的DynamicResource setter看起来像是一个解决方案但对Silverlight不起作用:(

更新:

我可以确认SetCurrentValue(ItemsProperty,new ObservableCollection< object>());正是我想要的 – 在WPF中.它写入默认值,但可以通过模板绑定覆盖它.任何人都可以建议Silverlight等效吗?说起来容易做起来难! :■

另一个更新:

显然,你可以使用值强制模拟.NET3.5中的SetCurrentValue,并且可以使用这些技术在Silverlight中模拟值强制.也许这里有一个(冗长的)解决方法.

SetCurrentValue workaround for .NET3.5 using Value Coercion
Value Coercion workaround for Silverlight

你不能只指定依赖属性的默认属性
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
        "Items",typeof(CaseDetailControl),new PropertyMetadata(new ObservableCollection<object>()));

还是我错过了你的追求?

编辑:

啊……在那种情况下如何在getter上检查null?:

public ObservableCollection<object> Items
    {
        get
        {
            if ((ObservableCollection<object>)GetValue(ItemsProperty) == null)
            {
                this.SetValue(ItemsProperty,new ObservableCollection<object>());
            }

            return (ObservableCollection<object>)GetValue(ItemsProperty);
        }

        set
        {
            this.SetValue(ItemsProperty,value);
        }
    }

猜你在找的设计模式相关文章