XAML は、基本的に、オブジェクト作成の省略形にすぎないことに注意してください。したがって、添付プロパティの値としてコレクション/リストを作成するには、それらを別のコレクション タグDisplayFilter
で囲む必要があります。TabItems
それをしたくない場合は、理解できることですが、プロパティに初めてアクセスしたときにコレクションを初期化する必要があります。
これには 1 つだけ問題があります。getter メソッドは、最適化として XAML リーダーによってスキップされます。呼び出しのname引数に別の名前を選択することで、この動作を防ぐことができます。RegisterAttached
DependencyProperty.RegisterAttached("DisplayFilterInternal", ...)
次に、プロパティ ゲッターが呼び出され、チェックできるようになりますnull
。詳細については、このブログ投稿をご覧ください。
編集:リンクされたブログ投稿が明確ではないようです。に渡される文字列の名前のみを変更RegisterAttached
し、静的な get/set メソッドの名前は変更しません。
public static readonly DependencyProperty DisplayFilterProperty =
DependencyProperty.RegisterAttached(
"DisplayFilterInternal",
typeof(IList),
typeof(ToolbarItem));
public static TabItemCollection GetDisplayFilter(Control item)
{ ... }
public static void SetDisplayFilter(Control item, IList value)
{ ... }
GetDisplayFilter
メソッドでコレクションを初期化する必要があります。
public static TabItemCollection GetDisplayFilter(Control item)
{
var collection = (IList)item.GetValue(DisplayFilterProperty);
if (collection == null) {
collection = new List<object>();
item.SetValue(DisplayFilterProperty, collection);
}
return collection;
}
TabItem
そのコレクションに要素を追加するだけのようです。その後、コレクションをタイプ セーフにすることができますがIList<T>
、XAML パーサーはジェネリック メソッドを呼び出すことができないため、使用は機能しませんAdd(T)
。Collection<T>
またList<T>
、非ジェネリックIList
インターフェイスを実装し、この場合に使用できます。将来コレクションに変更を加える場合に備えて、新しいコレクション タイプを作成することをお勧めします。
public class TabItemCollection : Collection<TabItem>
{
}
次のようにコレクションを明示的に設定することを気にしない場合:
<ui:ToolbarItem.DisplayFilter>
<ui:TabItemCollection>
<TabItem/>
</ui:TabItemCollection>
</ui:ToolbarItem.DisplayFilter>
メソッドを削除できますSetDisplayFilter
。
要約する:
public class TabItemCollection : Collection<TabItem>
{
}
public class ToolbarItem
{
public static readonly DependencyProperty DisplayFilterProperty =
DependencyProperty.RegisterAttached(
"DisplayFilterInternal", // Shadow the name so the parser does not skip GetDisplayFilter
typeof(TabItemCollection),
typeof(ToolbarItem));
public static TabItemCollection GetDisplayFilter(Control item)
{
var collection = (TabItemCollection)item.GetValue(DisplayFilterProperty);
if (collection == null) {
collection = new TabItemCollection();
item.SetValue(DisplayFilterProperty, collection);
}
return collection;
}
// Optional, see above note
//public static void SetDisplayFilter(Control item, TabItemCollection value)
//{
// item.SetValue(DisplayFilterProperty, value);
//}
}