2011-05-01 62 views
3

我正试图在WPF中基于an existing implementation [Download Source]构建标签云。我不完全理解实现,我的问题是,不是将FontSize绑定到集合中的项目数,而是想将它绑定到类中包含的其他值。所以在这里这一部分,在WPF中构建标签云

FontSize="{Binding Path=ItemCount, Converter={StaticResource CountToFontSizeConverter}}" 

我想要将FontSize绑定到其他东西。我怎么做? ItemCount属于哪里?

感谢

回答

2

ItemCount属于group在从该Tag生成的集合视图内。

例如如果我有一个列表

AABBBC

而且我组他们我得到:

A组:ItemCount中= 2
B组:ItemCount中= 3
C组: ItemCount = 1

标签云的整个要点是绑定到那个属性,因为你想要显示某个标签被使用的频率。


为了回应您的意见,裸骨设置应该是这样的:

<ItemsControl ItemsSource="{Binding Data}"> 
    <ItemsControl.Resources> 
     <vc:CountToFontSizeConverter x:Key="CountToFontSizeConverter"/> 
    </ItemsControl.Resources> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}" Margin="2" 
         FontSize="{Binding Count, Converter={StaticResource CountToFontSizeConverter}}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

我假设你的数据对象类公开属性NameCount,以确保随着数量的增加,数据对象类需要实现INotifyPropertyChanged这个大小就会随着数量的增加而变化,这就是大约所有的要求。

public class Tag : INotifyPropertyChanged 
{ 
    private string _name = null; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (_name != value) 
      { 
       _name = value; 
       OnPropertyChanged("Name"); 
      } 
     } 
    } 

    private int _count = 0; 
    public int Count 
    { 
     get { return _count; } 
     set 
     { 
      if (_count != value) 
      { 
       _count = value; 
       OnPropertyChanged("Count"); 
      } 
     } 
    } 

    //... 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
+0

是的,但我已经有我的数据,我无法数数。我所拥有的更像是一个string-int类型的键值列表,我想用一个标签云来显示带有FontSize字符串的int值。 – user579674 2011-05-01 12:49:40

+0

然后你完全没有使用该实现。你可以把它放到一个ItemsControl中并对其进行模板化。那么,至少你不需要重写转换器,但是所有的分组魔法都是毫无意义的。 – 2011-05-01 12:52:32

+0

也许这是真的。有了您的建议,标签云仍然能够随列表更改而动态更新?你能解释一下怎么做吗? – user579674 2011-05-01 12:57:18

0

ItemCount中是什么情况包含在WPF的DataContext属性对象的属性,你想改变的字号。在层次结构树中,从FrameworkElement开始的所有内容都继承了“DataContext”属性。

With "snoop"您可以在运行时查看WPF App的UI树,找出在任何给定时间你的DataContext中有哪些对象存在。

+0

我不明白我在用snoop寻找什么。我不能只将绑定路径设置为其他东西吗?例如,我在我的主窗口中有一个整数列表? – user579674 2011-05-01 12:43:18