如何解决自定义控件中的 WPF TemplateSelector - 代码中的用法
在我的 MVVM 项目中,我必须创建一个继承自网格的自定义控件 RowGrid。 这个控件有一个 ItemsSource 和一个 ItemsTemplateSelector。 (我没有使用 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 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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。