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 は、ロード時に 1 回実行される静的ルックアップです。その時点でターゲット リソースが見つからない場合は、現在表示されているエラーが発生します。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 に答える