【问题标题】:.NET 4.5/WPF - Binding to the property of a static property.NET 4.5/WPF - 绑定到静态属性的属性
【发布时间】:2014-06-21 06:21:02
【问题描述】:

所以我尝试使用以下 XAML 将 TextBlock 绑定到 ObserverableCollection 的 Count 属性

<TextBlock x:Name="inactiveCount">
    <TextBlock.Text>
        <Binding Path="(sockets:Manager.inactiveCollection.Count)" Mode="OneWay" StringFormat="Inactive: {0}" />
    </TextBlock.Text>
</TextBlock>

但我在运行程序时收到异常:

Type reference cannot find type named '{clr-namespace:MyProgram.Net.Sockets;assembly=MyProgram}Manager.inactiveCollection'.

绑定到 Manager 类中的其他属性可以正常工作,并且 inactiveCollection 确实作为静态属性存在。我到底做错了什么?

编辑

所以根据 fmunkert 下面的建议,我已将其更改为

<TextBlock x:Name="inactiveCount">
    <TextBlock.Text>
        <Binding Path="Count" Source="(sockets:Manager.inactiveCollection)" Mode="OneWay" StringFormat="Inactive: {0}" />
    </TextBlock.Text>
</TextBlock>

而且它确实有效。当在 Manager 的静态构造函数中初始化的集合中有 233 个对象时,它显示错误的计数为 52。当对象从集合中移除时,它永远不会更新

编辑 2

namespace MyProgram.Net.Sockets
{
//technically this is ProxyClientManager but I renamed it here to make the code smaller
    class Manager
    {
        public static ObservableCollection<ProxyClient> inactiveCollection { get; set; }

        static Manager()
        {
            inactiveCollection = new ObservableCollection<ProxyClient>();
            //do stuff to populate inactiveCollection with 233 objects
            //do other stuff like start threads to add/remove objects from the collection
        }
    }
}

【问题讨论】:

  • 也许您应该发布带​​有Manager.inactiveCollection 声明的代码以及显示您如何添加/删除项目的代码。
  • 完成。它的实际填充与一些 SQL 查询有关,它的填充方式并不重要,在静态构造函数的末尾它包含 233 个对象。
  • 您需要按照 fmunkert 在回答中的建议在 Source 中使用 x:Static

标签: .net wpf xaml binding static


【解决方案1】:

使用{x:Static} 作为绑定源,例如像这样:

<TextBlock Text="{Binding Path=Count, Source={x:Static sockets:Manager.inactiveCollection}, Mode=OneWay, StringFormat='Inactive: {0}'}"/>

【讨论】:

  • 只是想知道,但您是否知道为什么它显示的绑定值不正确?例如,当集合中有 233 个对象时,它会显示“Inactive: 52”?此外,当从集合中添加/删除对象时,它似乎根本没有更新?
  • 它还告诉我,当我使用您的 Text 值时,在 ProxyClientManager 中找不到 inactiveCollection。但它会发现我将 XAML 与我第一条评论中提到的更改一起使用。
  • ProxyClientManager 类与Manager.inactiveCollection 属性有什么关系? Manager.inactiveCollection的数据类型真的是ObservableCollection&lt;T&gt;吗?
  • ProxyClientManagerManager,我只是在这里重命名,让这里的代码更小。我忘了在我的评论中改变它。是的inactiveCollection 真的是ObservableCollection&lt;T&gt;。它在类的静态构造函数中初始化和填充。很抱歉造成混乱。
  • 总是相同的ObservableCollection。对象被添加到其中/从中删除,它永远不会被另一个集合替换。
【解决方案2】:

所以 fmunkert 部分正确,我需要指定一个源,但我还需要为 Window.Resources 中的类指定一个 StaticResource。以下 XAML 对我有用:

<Window.Resources>
    <sockets:Manager x:Key="Manager"/>
</Window.Resources>
<TextBlock x:Name="inactiveCount" Text="{Binding Path='inactiveCollection.Count', Source='{StaticResource Manager}', StringFormat='Inactive: {0}'}"/>

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 2014-01-29
    • 1970-01-01
    • 2011-01-18
    • 2021-01-17
    • 1970-01-01
    • 2010-10-30
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多