考虑以下 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 的引用
然后你可以使用 VisualTreeHelper
或 Control.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/