在DataTemplateSelector上使用datatemplate的WPF字典,其键值总是为空
本文关键字:键值 字典 WPF DataTemplateSelector datatemplate | 更新日期: 2023-09-27 18:07:39
我在DataTemplateSelector上有一个字典,它保存了一个数据模板列表。构造函数创建字典持有DataTemplate属性作为值,但字典总是反映空值,同时我可以看看属性当SelectTemplate被调用,属性有正确的DataTemplate在它。字典(我认为是引用类型)在创建字典而不是对象时总是显示初始"null"值,这是怎么回事?
有没有什么方法可以让这个工作而不用丢弃字典和使用开关?我用它来避免一个巨大的switch语句,但我不确定为什么这不起作用。
视图:
<selector:NodePropertyGridTemplateSelector x:Key="sel">
<selector:NodePropertyGridTemplateSelector.PageLoadedDataTemplate>
<DataTemplate>
...
</DataTemplate>
</selector:NodePropertyGridTemplateSelector.PageLoadedDataTemplate>
</selector:NodePropertyGridTemplateSelector>
DataTemplateSelector:
public class NodePropertyGridTemplateSelector : DataTemplateSelector
{
private Dictionary<string, DataTemplate> _dictionary;
public NodePropertyGridTemplateSelector()
{
_dictionary = new Dictionary<string, DataTemplate>();
_dictionary.Add("PageLoaded", PageLoadedDataTemplate);
}
public override DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
{
if (item != null)
{
return (DataTemplate)_dictionary["PageLoaded"];
//return PageLoadedDataTemplate; this works fine. The above dictionary is null for the value at this key.
}
return base.SelectTemplate(item, container);
}
public DataTemplate PageLoadedDataTemplate { get; set; }
当NodePropertyGridTemplateSelector的构造函数执行时,PageLoadedDataTemplate属性的内容仍然是null,并且这个null值正在被添加到字典中。
稍后-在构造函数返回并创建NodePropertyGridTemplateSelector实例之后-另一个值(对DataTemplate对象的引用)被分配给PageLoadedDataTemplate。然而,虽然PageLoadedDataTemplate属性的内容现在是不同的,但存储在字典中的内容仍然是null。
要使字典始终反映PageLoadedDataTemplate属性的当前内容,请在属性setter中更新字典。通过这样做,还必须实现getter——它应该简单地获取并返回存储在字典中的相应值。
public class NodePropertyGridTemplateSelector : DataTemplateSelector
{
private readonly Dictionary<string, DataTemplate> _dictionary = new Dictionary<string, DataTemplate>();
public override DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
{
if (item != null)
{
DataTemplate dt;
if (_dictionary.TryGetValue("PageLoaded", out dt))
return dt;
}
return base.SelectTemplate(item, container);
}
public DataTemplate PageLoadedDataTemplate
{
get
{
DataTemplate dt;
return _dictionary.TryGetValue("PageLoaded", out dt) ? dt : null;
}
set
{
if (value == null) _dictionary.Remove("PageLoaded");
else _dictionary["PageLoaded"] = value;
}
}
}
这里给出的示例代码避免了null值存储在字典中。如果字典(或属性)应该/可以从不同的线程以并发的方式访问,那么使用ConcurrentDictionary可能会更安全。