如果我在执行此操作的代码后面的类中有代码:
MyElement.Content = new XamlUserControlFile();
我怎样才能在 xaml 中做同样的事情?
也许您想要的是一个带有包含用户控件的 XAML 的 ContentControl?
但是,对于 ContentControl 的内容有一些限制, 您可以在此处看到。内容必须是 Text(使用 ToString() 方法)或 UIElement 派生对象。
您可以简单地在 ContentControl 中构建某种 UserControl,将 xaml 与控件的使用分开。
更新
使用像caliburn.micro这样的 MVVM 框架会让你非常接近 MVVM。您只需从 ViewModels 引用 ViewModels。您可以完全摆脱代码隐藏。
假设您有一个像这样的 UserControl
<UserControl x:Class="MyUserControlView"
...>
<Grid Background="Green">
</Grid>
</UserControl>
然后你有一些 ViewModel :
public class MyUserControlViewModel : PropertyChangedBase
{
}
然后你可以很容易地在屏幕(视图和视图模型)中有一个绑定,它应该包含那个UserControl
public MyUserControlViewModel MyUserControlViewModel { get; set; }
通过包含类中的构造函数注入对其进行初始化
public ShellViewModel(MyUserControlViewModel viewModel)
{
this.MyUserControlViewModel = viewModel
}
并设置绑定(在包含 XAML 中),如:
<ContentControl Name="MyUserControlViewModel " />
这就是你所要做的,就这么简单。
请注意,caliburn.micro 具有“约定优于配置”,因此您必须将视图命名为“...View”,并将您的 ViewModel 命名为“...ViewModel”。(但您可以设置自己的规则)。
而且,在这个例子中非常重要:caliburn.micro 可以并且将设置一个绑定,<x:Name="...">
正如您在上面的 ContentControl 中看到的那样。
这并不完全清楚,但缺少更多信息......
如果您正在使用类似...
hostControl.Content = XamlReader.Load(YourXAML);
或者LoadComponent
等等。
我认为 XAML 中没有任何“速记”(如果有的话,我想看看:)。
1)你可以使用其中之一...
Content="{x:Static my:YourStaticClass.XAMLProperty, Converter=...}"
Content="{Binding Source={x:Static my:YourStaticClass.XAMLProperty}, Converter=...}"
Content="{Binding ViewModelXAMLProperty}, Converter=...}"
要绑定到一个属性,该属性会公开您想要放入 的Content
or 内部(已加载并准备好)。Control
你需要prepare
它,所以它是你想要的形式(直接的 XAML 不起作用,但某种形式的负载)。
我已经指定Converter
这是另一种方式 - 如果需要,您可以即时转换 XAML。
2)您也可以Load
从后面的代码中获取 XAML - 并将其放入资源中 - 或定义一些您在 XAML 中实例化的包装器。
然后你使用{StaticResource ...}
或 DynamicResource 等。
可能性是无穷无尽的——你应该提供一些更相关的信息。