WPF DataTemplate - x:Key 与 DataType="{x:Type XXXX")

发布于 2024-08-15 15:41:44 字数 450 浏览 2 评论 0 原文

我想使用 FrameworkElement.FindResource() 查找一个 DataTemplate。为此,我需要拥有数据模板上的密钥。

问题在于 x:key 和分配数据类型是互斥的。 (参考

因此,一旦我为模板设置了数据类型,如何找到关键值?是否有一些公式可以将 DataTemplate 转换为 Key 的字符串?

(有关为什么我需要获取资源找到的 DataTemplate 的疑问,请参阅此问题

I have a DataTemplate that I want to find using the FrameworkElement.FindResource(). To do that I need to have a key on the data template.

The problem is that x:key and assigning a data type are mutually exclusive. (Reference)

So, once I set the DataType for my template, how do I find the Key value? Is there some formula that converts the DataTemplate into a string for the Key?

(For inquries as to why I need to get the DataTemplate found by Resource see this question.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

辞慾 2024-08-22 15:41:44

x:Key 似乎是 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>

代码隐藏:

//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
        }
    }
}

The x:Key seems to be an object of type System.Windows.DataTemplateKey. So, you can "create" the key for your resource with new DataTemplateKey(typeof(myType)). FindResource will work with this key, since TemplateKey.Equals has been overridden.

Here is a very simple example application:

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
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文