如果我這樣創建一個自定義的控制: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設置值置於模板綁定之上!
所以,我明白爲什麼這不起作用,但我想知道是否有解決方案。是否有可能爲MyControl的懶消費者提供默認值ItemsProperty給新的ObservableCollection,只需要以編程方式添加Items,同時允許MyControl的MVVM高級用戶通過DataTemplate綁定到相同的屬性?
這是用於Silverlight的& WPF。在樣式DynamicResource制定者似乎是一個解決方案,但不會爲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
而不是'檢查空項目=新的ObservableCollection
謝謝,我們正在取得進展。對Silverlight感到羞恥!另一種解決方案是將默認通過樣式設置爲DynamicResource。再次,沒有silverlight:S –
你可能會存儲原始綁定,例如var x = this.GetBindingExpression(ItemsProperty).ParentBinding;然後將項目設置爲默認值,然後重置綁定到他們是什麼? this.SetBinding(ItemsProperty,x);不知道它在什麼級別重置 - 所以也許這可以工作? – SteveL