0

シンプルな DataTemplateSelector をセットアップしました。

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        if (element != null && item != null && item is ParameterViewModel)
        {
            ParameterViewModel paramItem = item as ParameterViewModel;

            if (paramItem.ControlInfo.Type == "slider")
            {
                return element.FindResource("sliderParam") as DataTemplate;
            }
            else if (paramItem.ControlInfo.Type == "button")
            {
                return element.FindResource("buttonParam") as DataTemplate;
            }
                            ...... etc

これで問題ありません。XAML に追加したところ、期待どおりに動作しました。

今、私がやりたいことは、条件が満たされた場合、返される前に DataTemplate にいくつかの追加コントロールを追加することです。私の最初の試みは、StackPanel FrameworkElementFactory を作成し、追加したいコントロールと共に DataTemplate の VisualTree を追加し、VisualTree が設定された DataTemplate を FrameWorkElementFactory に返すことでした。

例えば

                FrameworkElementFactory spFactory = new FrameworkElementFactory(typeof(StackPanel));

                if (paramItem.ControlInfo.Type == "slider")
                {
                    spFactory.AppendChild((element.FindResource("sliderParam") as DataTemplate).VisualTree);
                }

  ...

                //add my extra controls 
                if(condition..)
                {
                    spFactory.AppendChild(extraControl);
                }

               return new DataTemplate { VisualTree = spFactory };

ただし、DataTemplate は XAML で定義されているため、VisualTree プロパティは常に null を返します。

コントロールを DataTemplate に追加するにはどうすればよいですか?

4

1 に答える 1

0

これを試して

...
if (paramItem.ControlInfo.Type == "slider")
{
   spFactory.AppendChild(FactoryFromResource("sliderParam"));
}
...

private FrameworkElementFactory FactoryFromResource(string resource)
{
    DataTemplate dataTemplate = FindResource(resource) as DataTemplate;
    FrameworkElementFactory factory = new FrameworkElementFactory(typeof(ContentControl));
    factory.SetValue(ContentControl.ContentTemplateProperty, dataTemplate);
    return factory;
}
于 2012-05-30T15:40:51.280 に答える