Решение, отправленное Stu Thompson, допустимо в Java5.0 и позже. Но я предпочел бы не использовать его, потому что я думаю, что это подвержено ошибкам.
легко забыть энергозависимый оператор и трудный понять, почему это необходимо. Без энергозависимого этот код больше не был бы ориентирован на многопотоковое исполнение из-за перепроверяемого антишаблона блокировки. Посмотрите больше об этом в абзаце 16.2.4 Параллелизм Java на практике . Короче говоря: Этот шаблон (до Java5.0 или без энергозависимого оператора) мог возвратить ссылку на объект Панели, который находится (все еще) в неправильном состоянии.
Этот шаблон был изобретен для оптимизации производительности. Но это больше - действительно не реальное беспокойство. Следующий ленивый код инициализации быстр и - что еще более важно, легче читать.
class Bar {
private static class BarHolder {
public static Bar bar = new Bar();
}
public static Bar getBar() {
return BarHolder.bar;
}
}
TemplateBinding - это не совсем то же самое. Документы MSDN часто пишут люди, которым приходится задавать вопросы односложным SDE о функциях программного обеспечения, поэтому нюансы не совсем правильные.
TemplateBindings оцениваются во время компиляции по типу, указанному в шаблоне элемента управления. Это позволяет намного быстрее создавать скомпилированные шаблоны. Просто нащупайте имя в привязке шаблона, и вы увидите, что компилятор отметит это.
Разметка привязки разрешается во время выполнения. Хотя выполнение привязки выполняется медленнее, она разрешает имена свойств, которые не видны в типе, объявленном шаблоном. Говоря медленнее, я отмечу, что это своего рода родственник, поскольку операция привязки занимает очень мало ресурсов процессора приложения. Если бы вы взрывали шаблоны управления на высокой скорости, вы могли бы это заметить.
TemplateBinding is a shorthand for Binding with TemplatedParent but it does not expose all the capabilities of the Binding class, for example you can't control Binding.Mode from TemplateBinding.
Они используются аналогичным образом, но имеют несколько отличий. Вот ссылка на документацию TemplateBinding: http://msdn.microsoft.com/en-us/library/ms742882.aspx
Я думал, что TemplateBinding не поддерживает морозные типы (который включает в себя кисти объекты). Обрести проблему. Можно использовать TemplatedParent