Wpf 当DataTemplate不可用时,从ResourceDictionary访问DataTemplate';我没有钥匙,只有TargetType
我有一个用XAML定义的带有codebehind的ResourceDictionary。我需要使用鼠标事件和数据绑定定义一些视图特定的行为,为此,我需要访问DataTemplate中定义的一些元素 问题是,DataTemplate没有键,它只有一个TargetType(这是必需的,所以WPF会自动将其用于给定的类型) 那么,如何从codebehind访问DataTemplate 编辑: 如果我在构造函数中的某个地方放置断点,我可以看到ViewModel的模板就在那里。似乎ResourceDictionary.Keys属性是一个对象数组,我要访问的键(实际上是对应的值)在调试器中如下所示:Wpf 当DataTemplate不可用时,从ResourceDictionary访问DataTemplate';我没有钥匙,只有TargetType,wpf,code-behind,resourcedictionary,targettype,Wpf,Code Behind,Resourcedictionary,Targettype,我有一个用XAML定义的带有codebehind的ResourceDictionary。我需要使用鼠标事件和数据绑定定义一些视图特定的行为,为此,我需要访问DataTemplate中定义的一些元素 问题是,DataTemplate没有键,它只有一个TargetType(这是必需的,所以WPF会自动将其用于给定的类型) 那么,如何从codebehind访问DataTemplate 编辑: 如果我在构造函数中的某个地方放置断点,我可以看到ViewModel的模板就在那里。似乎ResourceDict
{DataTemplateKey(Company.Application.ViewModels.TargetViewModel)}
XAML:
DataTemplates
只提到了DataType
,但没有x:Key
将为它们创建一个隐式键。因此,基本上要访问DataTemplate,只需创建DataTemplate键并将其用作ResourceDictionary
示例代码如下:
new DataTemplateKey(typeof(TargetViewModel));
如果使用
x:Key
,则可以使用静态方法FindResource
。我不知道“无名”DataTemplates
。Sorry@Tico最基本的一点是,如果要为给定类型自动(而不是显式)加载数据模板,就不要将密钥放入其中。如果我放置一个断点,我可以看到隐式键,只是不知道如何访问它,请查看我的编辑。当我使用DataTemplates
时,它只使用XAML,而不使用代码隐藏。但我确实使用上述方法应用资源。好问题,我将关注这个线程。正如您在编辑中提到的,只提到数据类型但没有键的数据模板将为它们创建一个隐式键。因此,对于您的DataTemplate,关键是newDataTemplateKey(typeof(TargetViewModel))
@sthotakura我非常感谢您,简单的一行var wantedTemplate=this[newDataTemplateKey(typeof(TelaColetaViewModel))我得到了我想要的。如果你把它写在一个答案里,我会接受的。太棒了。我真的希望找到一个使用数据类型的数据模板。谢谢
public partial class TelaColetaTemplate : ResourceDictionary
{
EllipseGeometry _geometria_circulo;
ScaleTransform _scale_transform;
Grid GridZoom;
Path CirculoGuia;
double _escala;
Point? _ponto_clicado_norm;
public TelaColetaTemplate()
{
InitializeComponent();
// three following lines work, accessing them with key, no problem
_geometria_circulo = (EllipseGeometry)this["geometriacirculo"];
_scale_transform = (ScaleTransform)this["transform"];
_escala = (double)this["escala"];
//var wantedTemplate = ????
......
new DataTemplateKey(typeof(TargetViewModel));