根据组大小设置项目样式

时间:2011-02-08 21:00:08

标签: c# wpf data-binding

我是WPF的新手,所以请原谅我,如果我遗漏了一些明显的东西。我有一个问题,我有一个AggregatedLabels的集合,我试图将每个AggregatedLabel的ItemCount绑定到我的DataTemplate中的FontSize,以便如果AggregatedLabel的ItemCount很大,那么我的listBox中将显示更大的fontSize我正在努力的部分是与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" />

1 个答案:

答案 0 :(得分:2)

在你的CollectionView到位的情况下,你可以绑定到Groups属性,我从未使用过它,会尝试并尽可能澄清......

编辑:好的,这是一种方法:

绑定到的数据必须是CollectionView.Groups CollectionView应该像这样定义:

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

然后你可以在代码中绑定CollectionViewGroup的各个属性,你需要的可能是:

  1. ItemCount
  2. Name
  3. 据说你的原始绑定应该有用。

    注意:您只将一个值传递给转换器,即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