Caliburn.Micro прямо сейчас (1.3.1) на самом деле не поддерживает эти «множественные» соглашения для того же FrameworkElement
, что вы описали.
EDIT:
Однако вы можете подключить в метод ViewModelBinder.BindProperties
и там вы можете реализовать свой собственный дополнительный convetion.
Я пошел один шаг дальше и реализован прототип, который работает, но это не надежный, ни элегантная и, вероятно, не правильный путь, чтобы сделать это. Но это может быть отправной точкой:
static AppBootstrapper()
{
ConventionManager.AddElementConvention<FrameworkElement>(
UIElement.IsEnabledProperty,
"IsEnabled",
"IsEnabledChanged");
var baseBindProperties = ViewModelBinder.BindProperties;
ViewModelBinder.BindProperties =
(frameWorkElements, viewModels) =>
{
foreach (var frameworkElement in frameWorkElements)
{
var propertyName = frameworkElement.Name + "Enabled";
var property = viewModels
.GetPropertyCaseInsensitive(propertyName);
if (property != null)
{
var convention = ConventionManager
.GetElementConvention(typeof(FrameworkElement));
ConventionManager.SetBindingWithoutBindingOverwrite(
viewModels,
propertyName,
property,
frameworkElement,
convention,
convention.GetBindableProperty(frameworkElement));
}
}
return baseBindProperties(frameWorkElements, viewModels);
};
}
Похоже относительно безболезненно способ достичь конечного результата, которого я хочу - хотя я действительно удивлен тем, что Caliburn Micro не имеет явной поддержки такого рода вещей, поскольку наличие привязок для 'IsEnabled' и' IsReadOnly' довольно распространено в пользовательском интерфейсе. [Я предположил, что мой GoogleFu был виноват, когда я не смог найти ответ сам.] – Bevan
Я обновил свое решение, потому что оригинал убил соглашения по умолчанию :) Теперь он также работает с вашим примером ' ' Bindings: Text-> Свойство: 'Name' и IsEnabled -> Свойство' NameEnabled'. –
nemesv
@juanagui благодарит за обновление. Я не знал, что API изменился с версией 1.3.1 – nemesv