Как получить доступ к одной свойства ViewModel / данных в другой ViewModel - PullRequest
0 голосов
/ 27 февраля 2019

Я много раз гуглял и искал на многих форумах, но я не получил то, что именно хочу.

Проще говоря, у меня есть главное окно, в котором сначала я должен отобразить 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;
        }
    }
}

Может кто-нибудь подсказать мне с этого момента,

Заранее спасибо:)

1 Ответ

0 голосов
/ 27 февраля 2019

Я предлагаю вам рассмотреть первую навигацию по модели представления.

В качестве отступления / наблюдения:

Устранение MainWindowViewModel из единства, по-видимому, происходит потому, что вы хотите передать его в другие модели представления.И это все, что вы передаете в дочерние модели.Даже если вы намереваетесь смоделировать mainwindowviewmodel, вы можете просто сделать это, создав свою копию в тестовом коде.

Ваша инъекция зависимостей на данном этапе просто усложняет ситуацию.

/ В сторону.

Рассмотрим подход в этом:

https://social.technet.microsoft.com/wiki/contents/articles/52485.wpf-tips-do-not-use-frame-and-page-for-navigation.aspx

MainWindowViewmodel управляет навигацией.Вы хотите сделать это с помощью кнопок в дочерних элементах управления в коде, как в примере?Нет проблем.Вы можете использовать привязку родственников к вашей команде и привязать кнопку в дочернем элементе управления к команде в mainwindowviewmodel.Вы можете связать параметр команды из дочерней модели представления, если вам нужны какие-то данные из этого.

Эта mainwindowviewmodel затем создает экземпляры любых дочерних моделей представления, а не их пользовательский контроль, выполняющий это.Mainwindowviewmodel может передать ссылку на себя, если это все еще необходимо.

...