0

在后面的代码中将 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>

然后在代码隐藏中我将模板设置如下:

   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”。谁能解释为什么?

如果您需要更多信息,请告诉我。

回应约翰斯的评论:

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

请让我知道这是否没有意义或者您需要任何澄清:)

4

1 回答 1

2

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

无需使用 XamlReader,您只需在 XAML 中声明您的 XAML 并利用那里可用的上下文:

<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;
于 2013-01-28T17:03:43.920 回答