WPF DataTemplate - x: ключ против DataType = "{x: тип XXXX") - PullRequest
11 голосов
/ 23 декабря 2009

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

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

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

(Чтобы узнать, почему мне нужно найти DataTemplate, найденный Resource, см. Этот вопрос .

1 Ответ

19 голосов
/ 23 декабря 2009

Кажется, что ключ 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
        }
    }
}
...