Pracuję nad moim pierwszym projektem w MVVM i zdecydowałem się użyć MVVM Light Toolkit. Mam , który obsługuje firmę na głównym ekranie mojej gry. Potrzebuję dowiedzieć się, jak otworzyć nowe okno (AdventurerView
) z instancją Adventurer
jako parametrem podczas wykonywania polecenia, czy jest ono powiązane z AdventurerViewModel
oraz wyświetlać i zwracać dane. Instancje tego okna będą często otwierane i zamykane. Utknąłem na tym od kilku dni i to doprowadza mnie do szału. Chciałbym nauczyć się, jak to zrobić w sposób przyjazny dla MVVM, najlepiej za pomocą narzędzi dostarczonych przez MVVM Light lub czysty XAML.MVVM Light & WPF - Wiązanie Wiele instancji okna do ViewModel
Próbowałem używać MVVM Light's ViewModelLocator
, ale ponieważ AdventurerView
jest oknem, to nie zadziała; jest napisane "Nie można umieścić okna w stylu", ale program nadal się kompiluje i działa. Czy może być coś, co mógłbym zmienić, aby to zadziałało? Czy istnieje inny sposób wiązania ich w XAML? Lub całkowicie inne podejście? Naprawdę chciałbym móc od tego odejść. Próbowałem również używać komunikatora MVVM Light bez rezultatu (który nadal nie rozwiązuje problemu View/ViewModel).
Po prostu muszę mieć możliwość utworzenia okna, które jest powiązane z AdventurerViewModel
i wyświetla/zwraca odpowiednie dane.
AdventurerView.xaml znajduje się obecnie w stanie domyślnym, ale uważam, że mógłbym powiązać odpowiednie dane, które mogą pomóc (DataContext).
AdventurerViewModel jest całkiem goły jak dobrze
class AdventurerViewModel : ViewModelBase
{
#region Members
private Adventurer _adv;
#endregion
#region Properties
public Adventurer Adv
{
get { return _adv; }
set { _adv = value; }
}
#endregion
#region Construction
public AdventurerViewModel(Adventurer adv)
{
this._adv = adv;
}
#endregion
}
App.xaml z nieprodukcyjnym DataTemplate na dole:
<Application StartupUri="MainWindow.xaml"
xmlns:views="clr-namespace:AoW.Views"
xmlns:vm="clr-namespace:AoW.ViewModels"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AoW.App"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
<DataTemplate DataType="{x:Type vm:GameViewModel}">
<views:GameView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:TitleViewModel}">
<views:TitleView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:AdventurerViewModel}">
<views:AdventurerView />
</DataTemplate>
</Application.Resources>
</Application>
Komenda w które miejmy nadzieję uczynić to wszystko wydarzy (komunikat tylko potwierdza, że polecenie jest uruchamiane):
private void ExecuteShowAdvCommand(Adventurer adv)
{
System.Windows.MessageBox.Show(adv.Name);
}
Naprawdę nie wiem, co jeszcze dodać.
Czy użyłeś 'Messenger', który pochodzi z mvvm-light? Mówiąc prościej, po pierwsze NIE zadeklaruj nowego okna jako 'DataTemplate' w twoim xaml MainWindow. To, co robisz jest w 'GameViewModel', kiedy potrzebujesz stworzyć swój" AdventureView ", wyślij wiadomość do' MainWindow', która powinna zarejestrować i odebrać ten komunikat w kodzie z tyłu, utwórz 'AdventureView' i wywołaj' Show() ' lub 'ShowDialog()' odpowiednio. 'SimpleIoC' powinien obsługiwać tworzenie VM dla' AdventureViewModel'. Czy to ma dla ciebie sens? – Viv
http://stackoverflow.com/questions/3386349/how-to-open-a-new-window-using-mvvm-light-toolkit pokazuje przykład otwarcia nowego okna przy użyciu MVVM Light. Jest kilka innych opcji robienia tego samego, ale powinien to być dobry początek. Teraz, wysyłając te "wiadomości", możesz przekazać dowolnie wybrany argument, upraszczając przekazywanie informacji o parametrach: – Viv
, tak jak w przypadku otrzymania odpowiedzi, która zależy od sposobu odzyskania danych, jeśli jest to dialog, który możesz wywołać ShowDialog, który będzie modalny i sprawdź jego wartość zwracaną lub ponownie użyj 'Messenger', aby wysłać wyniki z powrotem do" GameViewModel' – Viv