mvvm - 如何判断一个 View 是否有特定的控件

标签 mvvm caliburn.micro

考虑以下 xaml:

<UserControl>
    <Grid x:Name="UiRoot"/>
</UserControl>

现在,在 ViewModel 中,我有一个对 View 的引用(来自 Caliburn.Micro OnViewLoaded)。然后我需要确定 View 是否有一个名为 UiRoot 的网格。
protected override void OnViewLoaded(object view) {
        base.OnViewLoaded(view);
    //Does the view have a UiRoot?
}

这段代码其实是在ViewModelBase中,有时候View会有一个UiRoot,有时候没有。它用于在 View 确实存在时动态创建 View 。

我的第一个想法是创建一个 IHasUiRoot 接口(interface)并将其放入代码隐藏中。然后我可以将它转换为 IHasUiRoot。这行得通,但由于我有一个其他空的代码隐藏,我想保持这种方式并通过反射或其他方式来完成。最后,我需要一个对实际控件的引用,以便动态地向它添加控件。

最佳答案

如果您正在实现 IViewAware可以使用 IViewAware.GetView() 的 View 模型,例如 Screen方法(在 OnViewLoaded 中我认为是 IViewAware 无论如何)来获取对 View 的引用

然后你可以使用 VisualTreeHelperControl.FindName获取对控件的引用:

var view = this.GetView() as Control;
if(view != null)
{
    var grid = view.FindName("UiRoot") as Grid;

    if(grid != null) // do stuff...
}

关于mvvm - 如何判断一个 View 是否有特定的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17355000/

相关文章:

MVVM:一个 ViewModel 是否应该拥有另一个 ViewModel 的成员?

windows-phone-7 - MVVM EventToCommand 参数为 NULL

c# - 我需要屏蔽导体吗(Caliburn Micro)

wpf - 从 ViewModel 绑定(bind)图像

android - View 或 ViewModel 是否负责将模型中的数据转换为在 UI 中呈现?

c# - CM Bootstrap 在 Root View 之前显示一个窗口

c# - WPF Caliburn.Micro ItemsControl ContextMenu 找不到方法

c# - 从 View 模型显示 MahApps.Metro 对话

c# - 使用 MVVM C#​​ 将 UpdateSourceTrigger 设置为 WPF ListBox 项源控件的显式

c# - Caliburn micro 将 message.attach 指向所需的 View 模型