【问题标题】:Static Binding to Singleton Mysteriously Fails对单例的静态绑定神秘地失败了
【发布时间】:2010-10-26 20:23:24
【问题描述】:

我有以下单例类,其中包含以下属性:

public class Manager : INotifyPropertyChanged
{
    public bool IsOnline
    ...

    public static Manager Instance
    ...
}

在标记中,我正在尝试根据此在线属性更改按钮的颜色:

<Button.Style>
 <Style TargetType="{x:Type Button}">
  <Style.Triggers>
   <DataTrigger Value="True">
    <DataTrigger.Binding>
     <Binding Source="{x:Static storage:Manager.Instance}" Path="IsOnline"/>
    </DataTrigger.Binding>
    <Setter Property="Background" Value="#8000FF00"/>
   </DataTrigger>
  </Style.Triggers>
 </Style>
</Button.Style>

此绑定&lt;Binding Source="{x:Static storage:Manager.Instance}" Path="IsOnline"/&gt; 失败并出现异常:

无法将属性“Source”中的值转换为“System.Windows.Markup.StaticExtension”类型的对象。

我已经对“存储”命名空间进行了四次检查;我知道它既被引用又是正确的。 Instance 属性是静态的,所以我不明白为什么这个绑定会失败。我对所有静态属性都有类似的绑定,一切都很好。

有什么想法吗?

【问题讨论】:

  • 如果使用会失败吗?
  • 是的,在这种情况下它也会失败。

标签: wpf binding


【解决方案1】:

我已经构建了一个示例应用程序,它完全符合您的描述,它可以正常运行。可以here下载。

【讨论】:

  • 我将假设它与我们正在使用的控制库(Infragistics)有关。在我发布的代码示例中,我将其简化为一个按钮,但它实际上是一个 Infragistics ToggleButton。我想这将问题隔离开来,不是吗? ;)
  • 最简单的方法是获取我的示例代码并通过 Infragistics ToggleButton 更改 Button...
【解决方案2】:

您是否尝试过使用 ValueConverter 来检查 StaticExtension 获得的值? (见this page上的方法2)

【讨论】:

  • 这是一个运行时异常,一旦加载按钮就会在启动时生成。它永远不会成为价值转换器。
【解决方案3】:

我刚刚遇到了同样奇怪的问题! 解决方案:

必须在对该类执行任何 XAML 操作之前实例化该类!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多