WPF DataTemplate - x: Key vs DataType = "{x: Тип XXXX" )

У меня есть DataTemplate, который я хочу найти, используя FrameworkElement.FindResource(). Для этого мне нужно иметь ключ в шаблоне данных.

Проблема заключается в том, что ключ x: и присвоение типа данных являются взаимоисключающими. (Ссылка)

Итак, как только я установил DataType для моего шаблона, как мне найти значение ключа? Есть ли какая-то формула, которая преобразует DataTemplate в строку для ключа?

(Для получения информации о том, почему мне нужно получить DataTemplate, найденный ресурсом, см. этот question.

Ответ 1

Ключ x: кажется, является объектом типа System.Windows.DataTemplateKey. Таким образом, вы можете "создать" ключ для своего ресурса с помощью new DataTemplateKey(typeof(myType)). FindResource будет работать с этим ключом, поскольку TemplateKey.Equals был переопределен.

Вот очень простое примерное приложение:

XAML:

<Window ...>
    <Window.Resources>
        <DataTemplate DataType="{x:Type TextBlock}">
        </DataTemplate>
    </Window.Resources>

    <Button Click="Button_Click">Test</Button>
</Window>

Codebehind:

//using ...

namespace WpfCsApplication1 {
    public partial class Window1 : Window {
        public Window1() {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e) {
            var key = new System.Windows.DataTemplateKey(typeof(TextBlock));
            var r = (DataTemplate)this.FindResource(key);

            MessageBox.Show(r.ToString()); // to show that it worked
        }
    }
}