我的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:/。输出窗口中也没有显示绑定错误,因此我无能为力。
我的问题:
答案 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作为路径。