当XamGrid被反序列化时,IValueConverter不会触发

本文关键字:IValueConverter XamGrid 反序列化 | 更新日期: 2023-09-27 17:49:41

虽然我已经使用c#很多年了,但我必须承认我对WPF + inffragistics控件还是个新手。如果您有任何见解,我很想听听您对以下场景的看法:

  1. PersistenceManager是为使用XAML的XamGrid配置的。(见[B] Persist Everything)
  2. 应用程序启动(第一次)
  3. XamGrid绑定到数据源
  4. 绑定包括一个转换器(参见:[a]列绑定)
  5. 转换器工作正常
  6. 用户调整Id列的大小
  7. 数据通过:PersistenceManager.Save(IgPersistenceGroup);
  8. 序列化
  9. 应用程序关闭
  10. 应用程序启动(第二次)
  11. XamGrid通过:PersistenceManager.Load(IgPersistenceGroup, _persistedData.IgPersistenceMemoryStream);
  12. 反序列化
  13. XamGrid绑定到数据源
  14. 新数据按预期显示
  15. 转换器的构造函数永远不会被调用,因此,会显示错误的数据
  16. Id列是预期的大小

在这个特殊的情况下,XamGrid的整个对象树正在被序列化/反序列化。因此,我怀疑我的问题与以下内容有关:

  1. 正在序列化/反序列化的绑定,或者
  2. 转换器被引用为StaticResource,当应用程序第二次启动时,该引用不再有意义

所以我的问题是:为什么XamGrid反序列化时IValueConverter不加载?

实际上,没有必要序列化整个XamGrid…但那是完全不同的问题。

  • inffragistics controls version 12.1.20121.2286
样例代码

[A]列绑定

<ig:TemplateColumn  Key="Severity" HeaderText="Event Severity">
<ig:TemplateColumn.ItemTemplate>
   <DataTemplate x:Name="SeverityColumn">
      <Image HorizontalAlignment="Center" Width="16" Height="16" Source="{Binding Converter={StaticResource SourceToTargetConverter}}" />
   </DataTemplate>
</ig:TemplateColumn.ItemTemplate>
</ig:TemplateColumn>

** SourceToTargetConverter:不是转换器的真实名称-转换器的名称在这里是无关的

[B] Persist Everything

<ig:XamGrid ig:PersistenceManager.PersistenceGroup="{DynamicResource igPG}" 
<ig:PersistenceManager.Settings>
   <ig:PersistenceSettings SavePersistenceOptions="AllButIgnored" >
      <ig:PersistenceSettings.PropertySettings>
         <ig:PropertyNamePersistenceInfo PropertyName="FilteringSettings"/>
      </ig:PersistenceSettings.PropertySettings>
   </ig:PersistenceSettings>
</ig:PersistenceManager.Settings>

引用

  • 使用inffragistics控制持久性框架
  • 关于fragistics Control Persistence Framework
  • MSDN: IValueConverter

当XamGrid被反序列化时,IValueConverter不会触发

XamGrid使用ig:PersistenceManager持久化时,TemplateColumn.ItemTemplate(又名:SeverityColumn)似乎没有被序列化。结果:

  1. 当应用程序第一次启动时,从BAML加载TemplateColumn.ItemTemplate,并以适当的格式显示列(使用提供的IValueConverter)。
      注意:您将能够使用Visual Studio的调试器和Watch窗口
  2. 查看ItemTemplate
  3. 在当前配置中,当XamGrid被反序列化时,ig:PersistenceManager显式地将TemplateColumn.ItemTemplate设置为null。
    • 未格式化数据在列中显示的原因是XamGrid自动退回到ig:TemplateColumnKey以从DataContext
    • 加载数据

更新1

现在我对what有了更好的理解,我可以解释why。以下内容直接摘自Infragistics文档:

"有些类型的属性不会被inffragistics Control Persistence Framework保存。它不保存AttachedProperties, DataTemplates, Paths, ControlTemplates, Styles和ItemPanelTemplates。"

[来源:About inffragistics Control Persistence Framework]