资源和ContentControl模板

时间:2013-01-28 15:13:52

标签: c# wpf

在后面的代码中将contentcontrols模板设置为xaml时,我无法访问父xaml中包含的静态资源。

我有一个内容控件如下:

<ContentControl x:Name="ccMaterial">
  <ContentControl.Resources>
    <x:Array x:Key="BondListKey" Type="sys:Int32" 
             xmlns:sys="clr-namespace:System;assembly=mscorlib" />
  </ContentControl.Resources> 
</ContentControl>

然后在codebehind中我按如下方式设置模板:

   string template = "<ControlTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" +
     "<ComboBox Grid.Column=\"1\" Grid.Row=\"0\" ItemsSource=\"{Binding Source={StaticResource BondListKey}}\"  />" +
"</ControlTemplate>";
ccMaterial.Template = (ControlTemplate)XamlReader.Parse(template);

问题是,当我尝试运行它时,我得到异常,说无法找到资源“BondListKey”。任何人都可以解释原因吗?

如果您需要更多信息,请与我们联系。

回应约翰斯的评论:

我有一个标签项,我希望能够根据表单上其他位置的用户选择在该标签中显示不同的控件。作为示例,如果用户选择了汽车,我希望能够更改控制模板以包括用于引擎尺寸,燃料类型等的文本框,如果用户选择橙色,我想要包括多样性和甜味的控制模板。我怀疑我可以通过在选项卡上绘制所有可能的控件来获得此功能,然后根据数据触发器更改relvant控件的可见/启用状态,但这可能涉及很多过滤控件(因为可能有很多用户选择)类型)。理想情况下我希望能够做的是将所需的控件模板作为字符串提供,解析并分配给控件的模板,从而在运行时修改其内容。

如果没有意义或者你需要任何澄清,请告诉我。)

1 个答案:

答案 0 :(得分:2)

StaticResource是一个静态查找,在加载时执行一次。如果当时未找到目标资源,则会出现错误,您现在正在看到该错误。因为您在XamlReader的上下文中加载模板,所以XAML中的资源不可用。在大多数情况下,修复是使用DynamicResource来提供在资源可用时更新的默认值,但Binding Source不是DependencyProperty,因此不能使用Dynamic。

您可以在XAML中声明XAML并利用其中可用的上下文,而不是使用XamlReader:

<ContentControl x:Name="ccMaterial">
    <ContentControl.Resources>
        <x:Array x:Key="BondListKey" Type="sys:Int32"
             xmlns:sys="clr-namespace:System;assembly=mscorlib" />
        <ControlTemplate x:Key="MyTemplate">
            <ComboBox Grid.Column="1" Grid.Row="0" ItemsSource="{Binding Source={StaticResource BondListKey}}"  />
        </ControlTemplate>
    </ContentControl.Resources>
</ContentControl>

然后,您仍然可以使用以下代码进行加载:

ccMaterial.Template = ccMaterial.FindResource("MyTemplate") as ControlTemplate;
相关问题