Я много раз гуглял и искал на многих форумах, но я не получил то, что именно хочу.
Проще говоря, у меня есть главное окно, в котором сначала я должен отобразить LoginUserControl
, когда пользователь нажимает кнопку, присутствующую в LoginUserControl
, она должна перейти к GameUserControl
, снова, когда он нажимает кнопку в GameUserControl
, она должна перейти к LoginUserControl
.
Я используюШаблон MVVM и Unity для DependencyInjection
(когда я искал, я слышал, что легко поддерживать экземпляры через него).
Вот что я пробовал до сих пор:
MainView:
<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<Grid>
<ContentControl Content="{Binding ShowControl}" />
</Grid>
MainViewModel:
class MainWindowViewModel : Bindable, IMainViewModel
{
private UserControl showControl;
public UserControl ShowControl
{
get
{
if (showControl == null)
showControl = App.Container.Resolve<LoginView>();
return showControl;
}
set
{
SetProperty(ref showControl, value);
}
}
}
LoginView:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Label Grid.Row="0" Content="{Binding Display}" />
<Button Grid.Row="1" Content="Navigate to Game View" Command="{Binding Navigae}" />
<TextBox Text="{Binding MyData, Mode=TwoWay}" Grid.Row="2" Margin="52,24,76,31" />
</Grid>
LoginView.cs:
public LoginView(IMainViewModel mainViewModel)
{
this.DataContext = new LoginViewModel(mainViewModel);
InitializeComponent();
}
LoginViewModel:
public class LoginViewModel : Bindable
{
// Bindable which implements INotifyPropertyChanged Event
IMainViewModel mainViewModel;
public LoginViewModel(IMainViewModel mainViewModel)
{
this.mainViewModel = mainViewModel;
this.Navigae = new RelayCommand(execute, canExecute);
display = "login view";
myData = "Gopi ";
}
private bool canExecute(object arg)
{
return true;
}
private void execute(object obj)
{
// mainViewModel.ShowControl = App.Container.Resolve<GameView>();
// here I want to access the ShowControl property from MainViewModel and update it
}
public ICommand Navigae
{
get; set;
}
private string display;
public string Display
{
get
{
return display;
}
set
{
SetProperty(ref display, value);
}
}
private string myData;
public string MyData
{
get
{
return myData;
}
set
{
myData = value;
}
}
}
Точно так же у меня есть GameView, GameView.cs и GameViewModel (только имя изменяется без LoginView)
IMainViewModel: (Он используется в качестве репозитория, который я видел в некоторых примерах)
public interface IMainViewModel
{
}
Я использую единство, потому что я не хочу создавать новые экземпляры каждый раз, когда я нажимаю кнопку.когда мы используем Unity, он создаст экземпляр в первый раз и будет использовать его позже.
Вот код App.cs:
public partial class App : Application
{
private static IUnityContainer _container;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
ConfigureContainer();
Application.Current.MainWindow = _container.Resolve<MainWindow>();
Application.Current.MainWindow.Show();
}
private void ConfigureContainer()
{
_container = new UnityContainer();
_container.RegisterType<IMainViewModel, MainWindowViewModel>(new ContainerControlledLifetimeManager());
}
public static IUnityContainer Container
{
get
{
return _container;
}
}
}
Может кто-нибудь подсказать мне с этого момента,
Заранее спасибо:)