WPF数据模板 - x:Key vs DataType="{x:Type XXXX"

11

我有一个DataTemplate,并想使用FrameworkElement.FindResource()方法来查找。为此,我需要在数据模板上设置关键字。

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

所以,一旦我为我的模板设置了DataType,如何找到Key值呢?是否有某种公式可以将DataTemplate转换为字符串以获取Key呢?

(有关为什么需要通过资源获取DataTemplate的查询,请参见此问题)。

1个回答

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

这看起来很不错,但是它是一个C#解决方案。有没有办法直接从XAML中实现这个?例如,我有一个数据类型模板,我在任何地方都可以使用它,但我也想将其用作TemplateSelector中的值。同样的问题...如果我添加一个键,我就会失去数据类型匹配。如果我不这样做,我不确定如何在XAML中引用它。 - Mark A. Donohoe
2
@MarqueIV:你应该可以使用 {x:Type ...} 作为键在 XAML 中引用它。 - Heinzi
尝试过这样写... DataTemplate="{StaticResource {x:Type vm:IOPBase}}",但是不起作用,程序崩溃了。(顺便说一下,我知道类型是正确的,因为该模板具有 'DataType="{x:Type vm:IOPBase}"',这个可以正常工作。)你有什么想法吗? - Mark A. Donohoe
@MarqueIV:好问题,我以为它会起作用。你能创建一个新问题并发布一个最小工作示例吗? - Heinzi
我有一种感觉它不会起作用,因为即使按照你自己的例子,类型也不是关键点...一个使用数据类型初始化的DataTemplateKey才是。是的...我会添加一个新的... - Mark A. Donohoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接