Есть ли способ закрыть Usercontrol из ViewModel в WPF - PullRequest
0 голосов
/ 04 марта 2019

Я работаю над приложением WPF, которое разработано с использованием шаблона MVVM.MainWindow имеет несколько пользовательских элементов управления, которые открываются при выполнении действия.Тем не менее, я хочу закрыть Usercontrol после завершения действий и при нажатии кнопки.Я посмотрел в нескольких местах, но пока мне не повезло.Любая помощь будет оценена.

Следует отметить, что мой вопрос является дубликатом этого:

Закрыть представление из ViewModel

Но этона самом деле это не так, поскольку этот поток говорит о закрытии окна, мой - о закрытии UserControl.

Добавление некоторого кода, чтобы прояснить это:

Это ItemsControl в первом UserControl, который содержитвторой Usercontrol:

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

Теперь, чтобы открыть второй UserControl, в первой UserControl ViewModel я делаю это:

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

     ViewsToShow.Add(new SecondUserControlViewModel());

Спасибо

1 Ответ

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

Ответ таков: вам не следует закрывать свои пользовательские элементы управления (если они не используются в качестве отдельных диалогов, и это не ваш случай, согласно вашему комментарию выше).

Все изменения в видимости пользовательских элементов управления касаютсянавигации.Как только вы логически перейдете к функции, включающей другой пользовательский контроль, вам придется скрыть старый и показать новый элемент управления.Обычно это делается с помощью выбора шаблона:

Два шаблона, по одному на UserControl, каждый из которых связан с соответствующей ViewModel:

<DataTemplate DataType="{x:Type ViewModels:FirstViewModel}">
    <controls:FirstControl />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModel:SecondViewModel}">
    <controls:SecondControl />
</DataTemplate>

Затем позже мы объявляем заполнитель:

<ContentControl Content="{Binding ViewModelSelector}" />

Как только ViewModelSelector свойство возвращает FirstViewModel, наш заполнитель покажет FirstControl.Если мы перейдем свойство ViewModelSelector к SecondViewModel, наш заполнитель автоматически заменит FirstControl на SecondControl и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...