2012-09-10 15 views
5

Jestem umiarkowanie nowy w MVVM i rozumiem niektóre zalety MVVM nad prostym kodem za Xaml (na przykład testowalność VM). Używamy Caliburn Micro do wykonywania niektórych wiązań, ale to nieistotne, mogę używać specyficznego wiązania {binding ...} i moje pytanie pozostanie mniej więcej tym samym.Skontrolować czas kompilacji powiązań?

Rozumiem logikę, że maszyna wirtualna nie powinna wiedzieć nic o V, jeśli wszystko jest zrobione poprawnie, ale wydaje się, że ponieważ używamy dynamicznego wiązania czasu pracy między V i maszyną wirtualną, kompilator nie może kontrolować legalności każdego wiążącego wyrażenia. Na przykład, jeśli mam składnik interfejsu użytkownika o nazwie UserName, Caliburn spróbuje powiązać go z właściwością VM o nazwie UserName w czasie wykonywania (podobnie jak w przypadku funkcji Value = "{binding UserName}"). Jednak jeśli zmienię nazwę mojej właściwości VM lub błędnie zapisuję nazwę komponentu UI lub wyrażenie wiążące, nie otrzymamy żadnego wskazania problemu do czasu wykonywania.

Wydaje mi się, że byłoby miło móc powiedzieć xaml, że składnik interfejsu użytkownika lub strona będą powiązane z konkretnym interfejsem, aby kompilator mógł wykonać niektóre prace, które w przeciwnym razie do zrobienia (i ponownego wykonania) przez dział testowy (i to jest dość często).

Czy istnieje sposób, aby powiedzieć xaml, że wiążemy interfejs lub typ obiektu? Czy istnieje jakieś narzędzie, które można podłączyć do aplikacji Xaml w celu sprawdzenia poprawności powiązań?

Odpowiedz

4

Podczas gdy kompilator nie przewiduje wsparcie dla kompilacji kontroli czasowych XAML, prawdopodobnie można osiągnąć dużo ten sam rezultat pisząc własne zadanie gromadzenie który tworzy wystąpienie każdy plik XAML za pośrednictwem klasy XAMLReader, a następnie za pomocą custom TraceListener do nasłuchiwania błędy wiązania.

Poza tym, jeśli jesteś przygotowany do tworzenia bazy danych za pomocą kodu, możesz utworzyć powiązania bezpośrednio odwołujące się do właściwości. Coś jak następujące (niesprawdzone)

Binding createBinding<TProperty>(Expression<Func<TProperty>> property, object source) 
{ 
    MemberExpression me = property.Body as MemberExpression; 
    if (me == null || me.Expression != property.Parameters[0] 
      || me.Member.MemberType != MemberTypes.Property) { 
     throw new InvalidOperationException(
      "Now tell me about the property"); 
    } 
    Binding b = new Binding(me.Member.Name); 
    b.Source = source; 

    return b; 
} 

// sample code 
Binding b = createBinding(()=>this.FontSize, this); 
textBlock1.SetBinding(TextBlock.FontSizeProperty, b); 
-1

Możesz łatwo sprawdzić, czy któreś z twoich powiązań nie powiodło się, szukając błędów bindowania w oknie wyjściowym w środowisku wykonawczym. Konieczne może być ustawienie informacji debugowania dla wiązania na verbose.

+0

-1: PO wyraźnie zażądał rozwiązania w czasie kompilacji. –

+0

aha ... jest to alternatywa –

+3

Nie jest. OP już o tym wie i nie chce z niego korzystać. –

Powiązane problemy