在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; }

在DataTemplateSelector上使用datatemplate的WPF字典,其键值总是为空

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可能会更安全。