Caliburn.Micro w tej chwili (1.3.1) tak naprawdę nie obsługuje tych "wielu" konwencji dla tego samego FrameworkElement
, co opisałeś.
EDIT:
Jednak można podłączyć do metody ViewModelBinder.BindProperties
i tam można zaimplementować własną dodatkową convetion.
poszedłem krok dalej i wdrożony prototyp, który działa, ale to nie jest solidna, ani elegancki i prawdopodobnie nie poprawny sposób to zrobić. Ale może to być punkt wyjścia:
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);
};
}
wydaje się stosunkowo bezbolesne sposób, aby osiągnąć końcowy rezultat, jakiego potrzebuję - choć jestem naprawdę zaskoczony, że Caliburn Micro nie ma wyraźnego wsparcia dla tego rodzaju rzeczy, ponieważ posiadanie powiązań dla 'IsEnabled' i' IsReadOnly' jest dość powszechne w interfejsie użytkownika. [Zakładam, że mój GoogleFu zawinił, gdy sam nie mogłem znaleźć odpowiedzi.] – Bevan
Zaktualizowałem moje rozwiązanie, ponieważ oryginalny zabił domyślne konwencje :) Teraz działa również z twoją próbką ' ' Wiązania: Tekst-> Właściwość: 'Nazwa' i IsEnabled -> Właściwość' NameEnabled'. –
nemesv
@juanagui dzięki za aktualizację. Nie wiedziałem, że interfejs API zmienił się z wersją 1.3.1 – nemesv