Я работаю над приложением WPF, разработанным с использованием шаблона MVVM. В MainWindow есть несколько пользовательских элементов управления, которые открываются при выполнении действия. Однако я хочу закрыть Usercontrol после завершения действий и нажатия кнопки. Я смотрел в нескольких местах, но пока не повезло с этим. Любая помощь будет оценена по достоинству.
Отмечается, что мой вопрос является дубликатом этого:
Но на самом деле это не так, поскольку в этом потоке говорится о закрытии окна, а в моем — о закрытии 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 в первой ViewModel UserControl, я делаю следующее:
private ObservableCollection<ObservableObject> viewsToShow = new ObservableCollection<ObservableObject>();
public ObservableCollection<ObservableObject> ViewsToShow
{
get
{
return viewsToShow;
}
set
{
viewsToShow = value;
OnPropertyChanged("ViewsToShow");
}
}
ViewsToShow.Add(new SecondUserControlViewModel());
Спасибо
UserControl в WPF нельзя «закрыть», потому что его нельзя «открыть». Для UserControl всегда требуется хост, на котором он может отображаться (Window, Page, ContentControl и т. д.). Что вы подразумеваете под "закрыть UserControl"?
что же должно произойти, когда вы «закроете» UserControl? как вы его закрываете?
@UUser: Ты прав. Я читаю только MainWindow и перечитываю следующее предложение.
Допустим, у меня есть один UserControl, который отображается, как только приложение открывается. (это внутри MainWindow). Когда я нажимаю кнопку в первом UserControl, открывается второй UserControl, и я выполняю там определенное действие, а затем нажимаю кнопку. Как только я нажму эту кнопку, он должен закрыть этот второй UserControl и вернуться к первому UserControl.
Visibility=Visible. Таким образом, вы можете скрыть это, установив Visibility=Collapsed через логическое свойство из модели представления.
@МартинБакаш; У меня есть ItemsContainer в первом UserControl. Я просто добавляю второй пользовательский элемент управления в этот ItemsContainer, и он открывается. <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>
@Sinatr: Извините, отредактировал вопрос, добавив пример кода.
Научите меня неправильно, но поскольку вы используете ItemsSource = "{Binding ViewsToShow}" и используете Add из своей ViewModel, вы также должны иметь возможность использовать Remove
Спасибо вам всем. Я фактически изменил код, чтобы скрыть UserControl (используя BooleanToVisibilityConverter), вместо того, чтобы закрывать его. Это работает.





Ответ таков: вы не должны закрывать свои пользовательские элементы управления (если только они не используются как отдельные диалоги, а это не ваш случай, согласно вашему комментарию выше).
Все изменения в видимости пользовательских элементов управления связаны с навигацией. Как только вы логически перейдете к функции, включающей другой пользовательский элемент управления, вы должны скрыть старый и показать новый элемент управления. Обычно это делается через выбор шаблона:
Два шаблона, по одному на 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 и наоборот.
Я делаю именно так, как вы упомянули выше. В этом случае, как мне скрыть SecondControl, как только я нажму кнопку в SecondControl?
Просто измените свойство ViewModelSelector (или то, как оно называется в вашем случае), чтобы ContentControl соответствующим образом обновил свой шаблон данных. Не занимайтесь пользовательскими элементами управления вручную.
Спасибо. Я фактически изменил код, чтобы скрыть UserControl (используя BooleanToVisibilityConverter), вместо того, чтобы закрывать его. Это работает.
@MartinBackasch: я не думаю, что это дубликат, поскольку в этой ветке говорится о закрытии Windows. Речь идет о пользовательских элементах управления.