对可观察集合的属性的数据绑定始终显示15

时间:2012-06-28 14:30:34

标签: c# wpf xaml data-binding

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

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个元素,所以很奇怪。所以我添加了一些测试,无论observable集合中有多少项,标签总是显示值15:/。输出窗口中也没有显示绑定错误,因此我无能为力。

我的问题:

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

3 个答案:

答案 0 :(得分:4)

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

试试这个:

Content="{Binding ActiveComputers.Count}"

答案 1 :(得分:2)

您正在将Source属性设置为字符串,String.Count为15.

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

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

关于有关文字格式的第3个问题,您可以使用ContentStringFormat属性格式化Label的内容

答案 2 :(得分: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's suggestion ...

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