Если Вы захотите заменить целый стиль (а не просто элементы его) тогда, то Вы будете, вероятно, хранить те стили в ресурсах. Необходимо быть в состоянии сделать что-то вроде:
<Button>
<Button.Style>
<MultiBinding Converter="{StaticResource StyleConverter}">
<MultiBinding.Bindings>
<Binding RelativeSource="{RelativeSource Self}"/>
<Binding Path="MyStyleString"/>
</MultiBinding.Bindings>
</MultiBinding>
</Button.Style>
</Button>
При помощи MultiBinding и использующий Сам как первая привязка мы можем тогда ресурсы поиска в нашем преобразователе. Преобразователь должен реализовать IMultiValueConverter (а не IValueConverter) и может выглядеть примерно так:
class StyleConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
FrameworkElement targetElement = values[0] as FrameworkElement;
string styleName = values[1] as string;
if (styleName == null)
return null;
Style newStyle = (Style)targetElement.TryFindResource(styleName);
if (newStyle == null)
newStyle = (Style)targetElement.TryFindResource("MyDefaultStyleName");
return newStyle;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Это не что-то, что я делаю очень часто, но это должно работать из памяти:)
Вы должны зарегистрировать пространство имен «Контакты_» в автозагрузчике. Для этого вы можете использовать Zend_Application_Module_Autoloader.
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Contacts_',
'basePath' => dirname(__FILE__) . '/modules/cotacts',
));
Это создаст следующие сопоставления для вашего модуля внутри указанного вами basePath.
api/ => Api
forms/ => Form
models/ => Model
DbTable/ => Model_DbTable
plugins/ => Plugin
Если вы используете Zend_Application для ускорения работы вашего приложения и его модулей, вам это не понадобится, потому что в документации говорится что:
При использовании начальной загрузки модулей с Zend_Application, экземпляр Zend_Application_Module_Autoloader будет создан по умолчанию для каждого дискретного модуля, что позволит вам автоматически загружать ресурсы модуля.
Я использую версию 1.9. Это часть моей начальной загрузки:
protected function _initAutoload() {
$modelLoader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => APPLICATION_PATH.'/modules/default')
);
}
protected function _initAutoloaders()
{
$this->getApplication()->setAutoloaderNamespaces(array('Eric_'));
return $this;
}
protected function _initPlugins()
{
$this->bootstrap('autoloaders');
$this->bootstrap('frontController');
// register the plugin for setting layouts per module
$plugin = new Eric_Plugin_Modularlayout();
$this->frontController->registerPlugin($plugin);
return $modelLoader;
}
Плагин Eric_Plugin_Modularlayout устанавливает правильный макет для каждого модуля.
У меня есть 3 модуля: default, ez, contacts. Самое забавное, что в действии контактов я могу вызывать модели в каталоге ez / models. без проблем.
Я обнаружил проблему. Я забыл вставить файл начальной загрузки с моим модулем контактов. Теперь все работает, и мои модули могут использовать свои собственные модели.
class Contacts_Bootstrap extends Zend_Application_Module_Bootstrap
{
}