Откройте второй пользовательский контроль из первого пользовательского элемента управления wpf MVVM - PullRequest
0 голосов
/ 01 марта 2019

У меня есть приложение WPF с шаблоном MVVM.У меня есть главное окно с несколькими вкладками.При нажатии на разные кнопки в главном окне, его пользовательский контроль будет отображаться.У меня это работает нормально.Тем не менее, мне нужно открыть пользовательский элемент управления при нажатии кнопки в одном из пользовательских элементов управления.Не из главного окна.Как мне это сделать?Это то, что у меня есть:

MainWindow.XAML: я создаю шаблоны данных для каждого пользовательского элемента управления

<DataTemplate DataType="{x:Type homeViewModel:HomeWindowViewModel}">
    <homeViewModel:HomeWindow></homeViewModel:HomeWindow>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:PauseViewModel}">
    <viewModel:Pause></viewModel:Pause>
</DataTemplate>
<DataTemplate DataType="{x:Type logoffVM:LogOffViewModel}">
    <logoffVM:LogOff></logoffVM:LogOff>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:ReportViewModel}">
    <viewModel:Report></viewModel:Report>
</DataTemplate>

И пользовательские элементы управления отображаются внутри ItemsControl:

<Grid x:Name="UserControlGrid"  Width="Auto" Height="auto" Margin="100,40,0,0">
    <ItemsControl ItemsSource="{Binding ViewsToShow}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid IsItemsHost="True" Width="auto" Height="auto"></Grid>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</Grid>

У меня есть кнопки, связанные с командой в классе MainWindow ViewModel.

В MainWindowViewModel:

public ObservableCollection<ObservableObject> ViewsToShow
{
    get
    {
        return viewsToShow;
    }
    set
    {
        viewsToShow = value;
        OnPropertyChanged("ViewsToShow");
    }
}

Команды:

public ICommand GetNextCommand
{
    get { return new RelayCommand(() => GetNext()); }
}

public ICommand GetOrderCommand
{
    get { return new RelayCommand(() => GetOrder()); }
}

И методы загрузки пользовательских элементов управления:

public void GetNext()
{
    Order orders = new Order();
    ViewsToShow.Clear();
    ViewsToShow.Add(new OrderDisplayViewModel("GetNext", orders, new WindowFactory()));
}

public void GetOrder()
{
    ViewsToShow.Clear();
    ViewsToShow.Add(new GetOrderViewModel());
}

Все этоработает нормально из MainWindow.Но как открыть пользовательский элемент управления GetOrder из пользовательского элемента управления GetNext?

Есть идеи?

1 Ответ

0 голосов
/ 01 марта 2019

Вы можете привязать свойство DataContext родительского окна к UserControl, используя RelativeSource;

<Button Command="{Binding DataContext.GetOrderCommand, RelativeSource={RelativeSource AncestorType=Window}}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...