【问题标题】:ValueConverter behaves like singletonValueConverter 的行为类似于单例
【发布时间】:2012-09-17 08:14:17
【问题描述】:

我有一个需要外部有状态模块才能工作的 ValueConverter。所以我从 Freezable 继承了它并声明了依赖属性。

public class Decorator : Freezable, IValueConverter
{
  public static readonly DependencyProperty HighlighterProperty =
      DependencyProperty.Register("Highlighter", typeof (IHighlighter), typeof (Decorator), new PropertyMetadata(null));

  public ITypeNameHighlighter TypeNameHighlighter
  {
    get { return (ITypeNameHighlighter)GetValue(TypeNameHighlighterProperty); }
    set { SetValue(TypeNameHighlighterProperty, value); }
  }
  //...
}

然后我使用 DataTemplate 和 DataTemplateSelector 来显示一个视图。 在资源中创建一个Decorator实例,并在绑定中使用

<DataTemplate x:Key="ViewTemplate">
...

<ListView ...>
  <Control.Resources>
    <GUI:Decorator x:Key="Decorator" **Highlighter="{Binding Highlighter}"** />
  </Control.Resources>
...

<GridViewColumn>
  <GridViewColumnHeader  ... />

    <GridViewColumn.CellTemplate>
      <DataTemplate>
        <GUI:RichTextBlock RichText="{Binding Path=Title, Converter={**StaticResource Decorator**}}" />
      </DataTemplate>
  </GridViewColumn.CellTemplate>
</GridViewColumn>
</ListView>
...
</DataTemplate>

问题是当创建多个 View 实例时,它们都使用一个(第一个)Decorator 实例将实体转换为 RichText(而实际上创建了几个 Decorator 实例 - 一个按视图)。 Highlighter 有一个状态,这就是为什么每个 View 都必须使用自己的 Decorator 实例的原因。

任何cmets为什么会出现这种行为? 任何想法如何解决它?

更新: D J 问我“为什么需要多个转换器实例”,所以我将描述这个任务。

应用程序中有多个相同视图的实例。每个 View 都包含自己的文本过滤器,用于从 ListView 中过滤掉元素。 ViewModel 端有一个 Highlighter,它有一个过滤器文本和字符串(在我们的例子中是 ListView 元素标题)作为输入,并返回标题的哪些部分与过滤器文本匹配的信息。 Decorator converts 具有从 Highlighter 返回的标题和信息作为输入,RichText 作为输出。

我同意 WPF 提供的表单中的 ValueConverter 不太适合该问题。但我在 View 方面看不到任何其他优雅的方式。

爱德华

【问题讨论】:

    标签: wpf binding datatemplate valueconverter


    【解决方案1】:

    将 x:Shared=False 放在声明转换器资源的位置。在每次调用时,它都会为您提供新对象。

    <GUI:Decorator x:Shared=False x:Key="Decorator" **Highlighter="{Binding Highlighter}"** /> 
    

    【讨论】:

    • 命名空间“schemas.microsoft.com/winfx/2006/xaml”中的共享属性只能在已编译的资源字典中使用。标记文件中的对象“装饰器”出错..此外,我在原始帖子中提到“......实际上创建了几个装饰器实例 - 一个由视图创建”。问题是尽管创建了多个装饰器实例,但只有一个用作 ValueConverter。
    • 为什么需要多个转换器实例?转换器的目的是将一种形式转换为另一种形式。但我认为您正试图保持转换器中进程的状态是错误的。
    • 我刚刚更新了原帖希望它能回答你的问题
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2012-09-18
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多