シンプルな 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 に追加するにはどうすればよいですか?