- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我遇到了 DataTemplate 键的奇怪行为:当通过 x:Type 指定 DataType,并且通过 x:Static 引用指定 x:Key 时,忽略 x:Key。我编写了示例应用程序来说明它。
XAML 资源:
<DataTemplate DataType="{x:Type wpfApplication1:TestDto}" x:Key="{x:Static wpfApplication1:DataKeys.TestDtoKey}" />
<DataTemplate x:Key="{x:Static wpfApplication1:DataKeys.TestDtoKey2}" />
<DataTemplate DataType="{x:Type wpfApplication1:TestDto}" x:Key="TestKey3" />
<DataTemplate DataType="wpfApplication1:TestDto" x:Key="{x:Static wpfApplication1:DataKeys.TestDtoKey4}" />
C#:
public class TestDto {}
public static class DataKeys
{
public static string TestDtoKey = "TestKey";
public static string TestDtoKey2 = "TestKey2";
public static string TestDtoKey4 = "TestKey4";
}
启动应用程序,在调试器中查看 this.Resources.Keys:
{DataTemplateKey(WpfApplication1.TestDto)} object {System.Windows.DataTemplateKey}
"TestKey2" object {string}
"TestKey3" object {string}
"TestKey4" object {string}
如您所见,在第一种情况下 x:Key 被忽略了!
谁能解释一下这是怎么回事?文档 ( http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype.aspx) 明确指出设置 x:Key 会将资源 key 设置为您在其中指定的任何内容。
最佳答案
Short answer to your question is - YES it's a bug in WPF framework. Bug reported here.
更新 -
Microsoft 已承认这是 XAML 编译器中的错误,并且他们没有修复此问题。引自微软 -
This is an issue in the XAML compiler - it produces BAML to describe the key for each resource, normally based on the x:Key if it's present and on the DataType if it's not. When x:Key is itself indirect (in your case, using x:Static), the compiler chooses the DataType key. While choosing the x:Static-based key is probably more "correct", changing this would introduce compatibility issues. Also, because the issue occurs at compile-time, you'd have to recompile your app to see the fix (to generate a different BAML stream). Existing copies of your app would contain the old BAML stream, and would behave the same way at runtime as they do now. For this reason we are deciding to won't fix this issue.
x:Key在这里没有被忽略而是被设置为DataTemplateKey(WpfApplication1.TestDto)
在第一种情况下。您不能在没有键值的情况下在资源部分声明资源。
如您所见, key 自动设置为 DataTemplateKey(WpfApplication1.TestDto)
在这里。
来自 MSDN -
This property that is very similar to the TargetType property of the Style class. When you set this property to the data type without specifying an x:Key, the DataTemplate gets applied automatically to data objects of that type. Note that when you do that the x:Key is set implicitly. Therefore, if you assign this DataTemplate an x:Key value, you are overriding the implicit x:Key and the DataTemplate would not be applied automatically.
以某种方式,以防你bind x:Key with static value
它不是硬编码字符串,而是 defined as default template for that dataType
因此 key 被设置为 DataTemplateKey(WpfApplication1.TestDto)
.
您可以通过将另一个 DataTemplate 添加到仅设置了 DataType 的资源中来验证这一点,即
<DataTemplate DataType="{x:Type wpfApplication1:TestDto}"/>
.
它可以正常编译,但会抛出运行时错误
"Item has already been added. Key in dictionary: 'DataTemplateKey(WpfApplication1.TestDto)' Key being added: 'DataTemplateKey(WpfApplication1.TestDto)'"
关于c# - 使用 x :Static 指定时忽略 DataTemplate 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19452800/
我正在使用 DataTemplate 将 View 应用于 ViewModel。我有一种情况,当 View 的一个实例(DataTemplate)中发生某件事时,我需要在所有其他实例中采取行动。 我已
如何从 DataTemplate 派生新类,然后用它代替 DataTemplate? 例如,在 C# 中: public class DerivedDataTemplate : DataTemplat
我有以下xaml; 当我使用 Node 模板显示 No
我想在 dataTemplate 中使用 dataTemplale。我想像这样在列表框中显示数据: 这就是我得到的。它不起作用。 cl
大家好,我正在尝试更改 dataGrid 中列的模板,但我找不到在 XAML 中执行此操作的方法。我正在尝试通过这种方式来做
wpf 应用程序中的默认 DataTemplate 显示 .ToString() 方法的结果。我正在开发一个默认 DataTemplate 不显示任何内容的应用程序。 我试过:
我发现自己有点束手无策……有束缚……呵呵……(跛脚) 无论如何...我需要引用主 ViewModel 的属性,但来自 DataTemplate ,它本身在另一个 DataTemplate 中... 看
我已经为我喜欢的项目中的一些数据类型创建了几个数据模板。这些数据模板真的很酷,因为它们像魔术一样工作,无论何时何地出现在 UI 中,都神奇地改变了数据类型实例的外观。现在我希望能够在一个特定的列表框中
这个问题在这里已经有了答案: 11年前关闭。 Possible Duplicate: Datatemplate inheritance 我有几个不是子类的数据类型,它们也不共享一个接口(interfa
我有一个用代码隐藏在 XAML 中定义的 ResouceDictionary。我需要使用鼠标事件和数据绑定(bind)定义一些特定于 View 的行为,为此我需要访问在 DataTemplate 中定
我有一个用代码隐藏在 XAML 中定义的 ResouceDictionary。我需要使用鼠标事件和数据绑定(bind)定义一些特定于 View 的行为,为此我需要访问在 DataTemplate 中定
我创建了一个 DataTemplateSelector,它使用一组已知接口(interface)进行初始化。如果传递到选择器的项目实现了这些接口(interface)之一,则返回关联的数据模板。 首先
是否可以将数据模板用于没有 ListBox 或其他项目控件的单个项目? 我有一个数据模板,我想在 xaml 中实例化,而不是在列表中,只是在边框内,并设置其数据上下文。 类似(伪):
在我的 MainWindow.xaml 中,我对 ResourceDictionary 有以下引用: 在 Main
我在数据模板中有 WPF ComboBox(列表框中有很多组合框),我想处理输入按钮。如果它是例如,那将很容易。一个按钮 - 我会使用命令 + 相对绑定(bind)路径等。不幸的是,我不知道如何使用命
我想对 ItemsCollection 进行数据绑定(bind),但不是渲染集合项,而是渲染通过集合项上的属性到达的子对象。 更具体地说:这将是游戏的 2D map 查看器(尽管在当前状态下它还不是
我使用 MasterDetailsView控制。它有 MasterHeaderTemplate属性(property)。我想添加一个 TextBox以便执行元素搜索。我不明白该怎么做。因为DataTe
我为自己设计的一个非常基本的 WPF 练习遇到了一个奇怪的问题,即从 ViewModel 动态填充菜单。给定以下主窗口标记:
在设计新的 WPF 应用程序时,我注意到在使用 DataTemplates 对控件进行数据绑定(bind)期间不会抛出异常。为了测试,我用尽可能少的逻辑编写了以下简单的用户控件。我正在使用在 WIN7
我有一个关于 this one 的问题:我正在尝试将一个事件附加到我的 StackPanel,但在使用 XamlReader 时它似乎没有连接。我无法调用 ChildItem_Load 方法。有谁知道
我是一名优秀的程序员,十分优秀!