自定义控件中的WPF TemplateSelector-代码中的用法



在我的MVVM项目中,我必须创建一个从网格继承的自定义控件RowGrid。此控件有一个ItemsSource和一个ItemsTemplate Selector。(我没有使用ItemsControl,因为我需要为每个子项设置一个相对大小,我通过将列宽设置为x*来实现这一点(我试图在代码中使用ItemsTemplateSelector分配模板,但它无法正常工作:

Children.Clear();
int i = 0;
foreach (var element in ItemsSource)
{
if (element != null)
{
DataTemplate dataTemplate = ItemTemplateSelector.SelectTemplate(element, null);
ContentControl contentControl = new ContentControl
{
DataContext = element, 
ContentTemplate = dataTemplate
};
Children.Add(contentControl);
SetColumn(contentControl, i);
}
i++;
}

ItemTemplateSelector.SelectTemplate是一个简单的开关/情况,根据元素的类型,返回特定的DataTemplate。

DataTemplate示例如下:

<DataTemplate x:Key="StringTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="{Binding Name}" Grid.Column="0"></Label>
<customControls:MyStringTextBox MyString="{Binding}" Grid.Column="1"/>
</Grid>
</DataTemplate>

如果我使用ItemsControl而不是我的RowGrid自定义控件,那么DataTemplate的绑定就可以工作。

如果我使用自定义控件,它们不会。

这意味着ItemsSource很好,ItemsTemplateSelector很好,DataTemplate也很好。问题是我如何将DataTemplate和它的ViewModel 组合在一起

我做错了什么?我错过了什么?

感谢您的支持!

我不是很喜欢它,但我找到了一个解决方案:

我以这种方式初始化内容控制:

ContentControl contentControl = MergeTemplateWithContext(dataTemplate, element)

public static ContentControl MergeTemplateWithContext(DataTemplate template, object context)
{
ContentControl contentControl = new ContentControl
{
ContentTemplate = template
};
contentControl.Loaded += (object sender, RoutedEventArgs e) =>
{
if (VisualTreeHelper.GetChildrenCount(contentControl) > 0)
{
DependencyObject child = VisualTreeHelper.GetChild(contentControl, 0);
if (child is ContentPresenter contentPresenter && VisualTreeHelper.GetChildrenCount(contentPresenter) > 0)
{
DependencyObject grandChild = VisualTreeHelper.GetChild(contentPresenter, 0);
if (grandChild is FrameworkElement frameworkElement)
{
frameworkElement.DataContext = context;
}
}
}
} ;
return contentControl;
}

最新更新