1

如果我在执行此操作的代码后面的类中有代码:

MyElement.Content = new XamlUserControlFile();

我怎样才能在 xaml 中做同样的事情?

4

2 回答 2

1

也许您想要的是一个带有包含用户控件的 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 中看到的那样。

于 2013-04-12T20:12:34.147 回答
1

这并不完全清楚,但缺少更多信息......

如果您正在使用类似...

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=...}"   

要绑定到一个属性,该属性会公开您想要放入 的Contentor 内部(已加载并准备好)。Control

你需要prepare它,所以它是你想要的形式(直接的 XAML 不起作用,但某种形式的负载)。

我已经指定Converter这是另一种方式 - 如果需要,您可以即时转换 XAML。

2)您也可以Load从后面的代码中获取 XAML - 并将其放入资源中 - 或定义一些您在 XAML 中实例化的包装器。

然后你使用{StaticResource ...}或 DynamicResource 等。

可能性是无穷无尽的——你应该提供一些更相关的信息。

于 2013-04-12T21:17:39.307 回答