1

我的 MainWindow 类中有以下依赖项属性(从 WPF 的 Window 继承)

public ObservableCollection<ComputerListItem> ActiveComputers 
        {
            get { return (ObservableCollection<ComputerListItem>)this.GetValue(ActiveComputersProperty); }
            set { this.SetValue(ActiveComputersProperty, value); }
        }

        public static readonly DependencyProperty ActiveComputersProperty = DependencyProperty.Register(
            "ActiveComputers", typeof(ObservableCollection<ComputerListItem>), typeof(MainWindow), new PropertyMetadata(new ObservableCollection<ComputerListItem>()));

现在我试图ActiveComputers.Count在我的 XAML 中给一个标签值所以我有这个:

<Window x:Class="ComputerManagerV3.MainWindow"        
        <!-- SNIP -->
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        >
    <Grid>
       <!--SNIP -->
        <Label Name="labelActive" Content="{Binding Source=ActiveComputers, Path=Count}" ></Label>

即使在设计器中,标签现在显示的值也是 15,这很奇怪,因为列表最初填充了 13 个元素。所以我添加了一些测试,无论可观察集合中有多少项目,标签总是显示值 15:/。输出窗口中也没有显示绑定错误,所以我不知道该怎么做。

我的问题:

  • 为什么绑定表达式的值总是15?
  • 如何编写正确的绑定,以便它始终显示列表中的项目数
  • 是否可以在不自己编写值转换器的情况下添加一些文本?
4

3 回答 3

4

您的绑定源是文字string“ActiveComputers”,其中包含 15 个字符。因此,您正在显示字符串中的字符数,并且根本没有连接到集合。

尝试这个:

Content="{Binding ActiveComputers.Count}"
于 2012-06-28T14:36:49.003 回答
2

您正在将您的Source属性设置为字符串,并且String.Count是 15。

要正确绑定到属性,请改用:

<Label Name="labelActive" Content="{Binding ActiveComputers.Count, 
     RelativeSource={RelativeSource AncestorType={x:Type Window}}" />

至于关于文本格式的第三个问题,您可以使用ContentStringFormat属性来格式化Label

于 2012-06-28T14:37:27.340 回答
1

这里有不止一个问题:

1)在依赖属性注册中,您将相同的列表实例传递给类的所有实例的属性。

public static readonly DependencyProperty ActiveComputersProperty =
    DependencyProperty.Register(
        "ActiveComputers",
         typeof(ObservableCollection<ComputerListItem>),
         typeof(MainWindow),
         new PropertyMetadata(new ObservableCollection<ComputerListItem>()))

而是使用默认值 null 注册并在类的构造函数中设置属性。

2)绑定路径错误。Source 应该是一条路径。ElementName 用于从 XAML 中的给定名称开始路径。尝试使用Rachel 的建议...

使用RelativeSource 在窗口而不是DataSource 开始路径,然后使用ActiveComputers.Count 作为路径。

于 2012-06-28T14:45:58.960 回答