【问题标题】:is there a way to close Usercontrol from ViewModel in WPF有没有办法从 WPF 中的 ViewModel 关闭用户控件
【发布时间】:2019-07-25 22:43:29
【问题描述】:

我正在开发一个使用 MVVM 模式开发的 WPF 应用程序。 MainWindow 有几个在执行操作时打开的用户控件。但是,一旦操作完成并单击按钮,我想关闭用户控件。我已经看过几个地方,但到目前为止还没有运气。任何帮助将不胜感激。

有人指出我的问题与此重复:

Close View from ViewModel

但实际上并非如此,因为那个线程谈论的是关闭一个窗口,我的是关于关闭一个用户控件。

添加一些代码以使其清晰:

这是承载第二个用户控件的第一个用户控件中的 ItemsControl:

<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());

谢谢

【问题讨论】:

  • @MartinBackasch:我不认为这是重复的,因为该线程谈到关闭 Windows。这是关于用户控件的。
  • WPF 中的UserControl 不能“关闭”,因为它不能“打开”。 UserControl 始终需要一个可以显示它的主机(WindowPageContentControl 等)。 “关闭UserControl”是什么意思?
  • 当你“关闭”一个 UserControl 时会发生什么?你怎么关闭它?
  • @UUser:你是对的。我只阅读了 MainWindow 并阅读了下一句。
  • 教我错了,但是由于您使用的是ItemsSource="{Binding ViewsToShow}" 并在您的ViewModel 中使用Add,您应该也可以使用Remove

标签: c# wpf mvvm


【解决方案1】:

答案是:您不应该关闭您的用户控件(除非它们被用作单独的对话框,根据您上面的评论,这不是您的情况)。

用户控件可见性的所有更改都与导航有关。一旦您从逻辑上导航到涉及另一个用户控件的功能,您必须隐藏旧的并显示新的控件。通常这是通过模板选择来完成的:

两个模板,每个 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)而不是关闭它。这是有效的。
猜你喜欢
  • 2011-04-13
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-15
相关资源
最近更新 更多