Элементы стиля, основанные на размерах группы - PullRequest
0 голосов
/ 09 февраля 2011

Я довольно новичок в WPF, поэтому прости меня, если я упускаю что-то очевидное. У меня возникла проблема, когда у меня есть коллекция AggregatedLabels, и я пытаюсь привязать ItemCount каждого AggregatedLabel к FontSize в моем DataTemplate так, чтобы, если ItemCount AggregatedLabel велик, тогда в моем списке будет отображаться больший 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 Ответ

2 голосов
/ 09 февраля 2011

С вашим CollectionView на месте вы можете привязать к свойству Groups, я никогда не использовал его, попробую и уточню, если возможно ...

Править: Хорошо, вот один из способов сделать это:

Данные, которые вы привязываете к , должны быть 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...