To pytanie mówi wszystko.
Mam okno i próbowałem ustawić DataContext przy użyciu pełnej przestrzeni nazw na ViewModel, ale wydaje się, że robię coś nie tak.
<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="BuildAssistantUI.ViewModels.MainViewModel">
Odpowiedzi:
Oprócz rozwiązania dostarczonego przez inne osoby (które są dobre i poprawne), istnieje sposób na określenie ViewModel w XAML, ale nadal oddzielenie określonego ViewModel od widoku. Rozdzielanie ich jest przydatne, gdy chcesz pisać pojedyncze przypadki testowe.
W załączniku xaml:
W pliku MainWindow.xaml:
źródło
Spróbuj tego zamiast tego.
źródło
Window
elementu, takiego jakDataContext="VM:MainWindowViewModel"
?MarkupExtension
, nigdy nie robił tego na maszynach wirtualnych, ale możesz to zrobić za pomocą konwerterów, aby upewnić się, że występuje tylko jedna instancja konwertera i wywołać ją bezpośrednio z xaml z="{converters:SomethingConverter}"
, co oznaczaxmlns:converters
punkty w przestrzeni nazw konwertera.public abstract class BaseValueConverter<T> : MarkupExtension, IValueConverter where T : class, new() { private static T _converter; public override object ProvideValue(IServiceProvider serviceProvider) { return _converter ?? (_converter = new T()); } }
Musisz utworzyć wystąpienie MainViewModel i ustawić go jako kontekst danych. W swoim oświadczeniu traktuje to po prostu jako wartość łańcuchową.
źródło
Możesz spróbować Catel . Pozwala zdefiniować klasę DataWindow (zamiast Window), która automatycznie tworzy model widoku za Ciebie. W ten sposób możesz użyć deklaracji ViewModel, tak jak w oryginalnym wpisie, a model widoku nadal zostanie utworzony i ustawiony jako DataContext.
Zobacz przykład w tym artykule .
źródło
Istnieje również sposób określenia modelu widoku:
<Rant>
Wszystkie wcześniej proponowane rozwiązania wymagają,
MainViewModel
aby mieć konstruktora bez parametrów.Microsoft ma wrażenie, że systemy można budować za pomocą konstruktorów bez parametrów. Jeśli również jesteś pod takim wrażeniem, śmiało skorzystaj z innych rozwiązań.
Dla tych, którzy wiedzą, że konstruktorzy muszą mieć parametry, a zatem instancji obiektów nie można pozostawić w rękach magicznych frameworków, właściwym sposobem określenia viewmodelu jest ten, który pokazałem powyżej.
</Rant>
źródło