如果我创建这样的自定义控件:
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 值置于模板绑定之上!
所以,我明白为什么这不起作用,但我想知道是否有解决方案。是否可以为只想以编程方式添加项目的 MyControl 的懒惰消费者提供新的 ObservableCollection 的 ItemsProperty 的默认值,同时允许 My Control 的 MVVM 高级用户通过 DataTemplate 绑定到相同的属性?
这适用于 Silverlight 和 WPF。风格的 DynamicResource 设置器似乎是一个解决方案,但这不适用于 Silverlight :(
更新:
我可以确认SetCurrentValue(ItemsProperty, new ObservableCollection<object>());
完全符合我的要求 - 在 WPF 中。它写入默认值,但它可以被模板绑定覆盖。任何人都可以建议一个等效的 Silverlight 吗?说起来容易做起来难!:秒
另一个更新:
显然,您可以使用值强制在 .NET3.5 中模拟 SetCurrentValue,并且可以使用这些技术在 Silverlight 中模拟值强制。也许这里有一个(冗长的)解决方法。
.NET3.5 的 SetCurrentValue 解决方法,使用Silverlight 的 Value Coercion Value Coercion workaround