2011-02-08 40 views
0

我對WPF相當陌生,所以請原諒我,如果我缺少一些明顯的東西。我有一個問題,我有一個AggregatedLabels的集合,我試圖將每個AggregatedLabel的ItemCount綁定到我的DataTemplate中的FontSize,這樣如果AggregatedLabel的ItemCount很大,那麼更大的fontSize將顯示在我的listBox中等等。我掙扎的部分是綁定到ValueConverter。任何人都可以協助非常感謝!基於組大小的樣式化項目

XAML代碼段

<DataTemplate x:Key="TagsTemplate"> 
    <WrapPanel> 
     <TextBlock Text="{Binding Name, Mode=Default}" 
      TextWrapping="Wrap" 
      FontSize="{Binding ItemCount, 
       Converter={StaticResource CountToFontSizeConverter}, 
       Mode=Default}" 
      Foreground="#FF0D0AF7"/> 
    </WrapPanel> 
</DataTemplate> 

<ListBox x:Name="tagsList" 
    ItemsSource="{Binding AggregatedLabels, Mode=Default}" 
    ItemTemplate="{StaticResource TagsTemplate}" 
    Style="{StaticResource tagsStyle}" 
    Margin="200,10,16.171,11.88" /> 

回答

2

與您CollectionView在的地方,你也許能夠綁定到Groups財產,我從來沒有使用的,會嘗試一下,如果可能的話澄清...

編輯:還好吧,這裏有一個方法來做到這一點:

您將數據綁定到需要到b E中的CollectionView.Groups,則CollectionView應該這樣定義:

CollectionView view = (ListCollectionView) CollectionViewSource. 
    GetDefaultView(LabelData); 
view.GroupDescriptions.Add(new PropertyGroupDescription("Name")); 

然後你就可以綁定到的代碼CollectionViewGroup各自的屬性,你需要的可能是:

  1. ItemCount
  2. Name

這就是說你的原始綁定應該管用。

注意:您只有一個值傳遞給變頻器,ItemCount中,因此應該是這樣的:

public class CountToFontSizeConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, 
     CultureInfo culture) 
    { 
     const int minFontSize = 6; 
     const int maxFontSize = 38; 
     const int increment = 3; 

     if ((minFontSize + (int)value + increment) < maxFontSize) 
     { 
      return (double)(minFontSize + (int)value + increment); 
     } 
     return (double)maxFontSize; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

編輯:進一步澄清...

只需添加CollectionView到您ViewModel作爲一個屬性,在其構造創建它:

public class TagCloudViewModel//:INotifyPropertyChanged 
{ 
    public ObservableCollection<AggregatedLabelModel> AggregatedLabels 
     {get; set;} 
    public CollectionView AggregatedLabelsView {get; set;} // <-This... 

    public TagCloudViewModel() 
    { 
     var data = new DataAccess(); 
     AggregatedLabels = data.GetData(); 

     //...and this: 
     AggregatedLabelsView = (ListCollectionView)CollectionViewSource. 
      GetDefaultView(AggregatedLabels); 
     AggregatedLabelsView.GroupDescriptions.Add(
      new PropertyGroupDescription("Name")); 
    } 
} 

然後綁定到AggregatedLabelsView.Groups

+0

我已經這樣做了,這只是我的XAML的片段 - 對不起,我沒有澄清。 – Ben 2011-02-08 21:07:23