次のようなカスタム コントロールを作成すると:
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 値を Template バインディングの上に置きます!
それで、これが機能しない理由は理解できますが、解決策があるのだろうか。My Control の MVVM パワーユーザーが DataTemplate を介して同じプロパティにバインドできるようにしながら、プログラムで項目を追加したいだけの MyControl の怠惰な消費者のために、ItemsProperty のデフォルト値を新しい ObservableCollection に提供することは可能ですか?
これは Silverlight & WPF 用です。スタイルの DynamicResource セッターは解決策のように見えましたが、Silverlight では機能しません :(
アップデート:
SetCurrentValue(ItemsProperty, new ObservableCollection<object>());
WPFで、まさに私が望んでいることを確認できます。デフォルト値を書き込みますが、テンプレート バインディングによってオーバーライドできます。誰でもSilverlightに相当するものを提案できますか? 言うは易く行うは難し!:s
別の更新:
どうやら、値強制を使用して.NET3.5でSetCurrentValueをシミュレートでき、これらの手法を使用してSilverlightで値強制をシミュレートできます。おそらく、ここには (長ったらしい) 回避策があります。
値の強制を使用した .NET3.5 の SetCurrentValue の回避策
Silverlight の値の強制の回避策