2011-01-12 5 views
0

Я изучаю некоторые .NET-программы, и в настоящее время я пытаюсь создать элемент управления облаком тегов в WPF. Цель состоит в том, чтобы иметь 2 списка в окне с первым списком, отображающим список «ContactLists» и второй список, отображающий «метки» (или теги), связанные с контактными списками. Для ярлыков целью является привязка размера шрифта к элементу itemCount с помощью IValueConverter, поэтому, если у меня есть конкретная метка, которая появляется несколько раз в моей коллекции, это будет отображаться более крупным шрифтом в списке меток. Также я заполняю свои элементы управления из базы данных DB2.Передача данных IValueConverter

Таким образом, у меня есть пока отображение списков контактов и ярлыков в правильных списках. У меня просто возникают проблемы с привязкой. Я использую класс конвертера, который я взял из учебника, и задавался вопросом, может ли кто-нибудь помочь мне заставить это работать. Большое спасибо - Бен

Свойства

public class Label 
{ 
    public int LabelID { get; set; } 
    public string LabelName { get; set; } 

} 

ContactListClass

public class ContactList  
    {   
     public string ContactListName { get; set; } 
     public List<Label> Labels { get; set; } 

    } 

Преобразователь

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; 
      int count = (int)value; 
      return ((minFontSize + count + increment) < maxFontSize) ? 
        (minFontSize + count + increment)    : 
        maxFontSize; 
     } 

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

окно Loaded событие

private void Window_Loaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     //TODO: Add event handler implementation here. 
     ListCollectionView lcv = new ListCollectionView(myLabels); 

     lcv.GroupDescriptions.Add(new PropertyGroupDescription("LabelName")); 

     tagsList.ItemsSource = lcv.Groups;      
    } 

XAML

<Window.Resources> 
    <local:CountToFontSizeConverter x:Key="CountToFontSizeConverter"/> 

    <Style x:Key="tagsStyle" TargetType="{x:Type ListBox}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBox}"> 
        <Grid> 
         <Border x:Name="Border" 
           BorderBrush="{TemplateBinding BorderBrush}" 
           BorderThickness="{TemplateBinding BorderThickness}"/> 
          <WrapPanel Orientation="Horizontal" 
             Margin="2" 
             IsItemsHost="true" 
             Background="#FFFCF6F6"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <DataTemplate x:Key="ContactsTemplate"> 
    <WrapPanel> 
     <TextBlock TextWrapping="Wrap" 
         Text="{Binding ContactListName, Mode=Default}"/> 
    </WrapPanel> 
    </DataTemplate> 

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

<Grid x:Name="LayoutRoot" Background="#FFCBD5E6"> 
    <ListBox x:Name="contactsList" 
      SelectionMode="Multiple" 
      Margin="7,8,0,7" 
      ItemsSource="{Binding ContactLists, Mode=Default}" 
      ItemTemplate="{DynamicResource ContactsTemplate}" 
      HorizontalAlignment="Left" 
      Width="254"/> 

    <ListBox x:Name="tagsList" 
      Margin="293,8,8,8" 
      ItemsSource="{Binding Labels, Mode=Default}" 
      ItemTemplate="{StaticResource TagsTemplate}" 
      Style="{StaticResource tagsStyle}" /> 
</Grid> 
+0

FYI - Я переформатировал ваш вопрос, чтобы сделать его более читаемым. Сначала я понятия не имел, что все это есть. В будущем у вас гораздо больше шансов получить ответы, если вы опубликуете вещи в более читаемом формате - я (например) вообще пропущу вопросы, где есть только большой блок кода, сбрасываемый там. Если это была копия-вставка из вашего собственного кода, я смиренно предлагаю вам также сделать некоторые форматирования. Это упрощает сохранение кода soooooo. –

ответ

0

Вы не очень точно с вашей проблемой, поэтому я просто хочу, чтобы выплюнуть некоторые комментарии.

Проблема заключается в том, что ваши модели (Label и ContactList) не реализуют INotifyPropertyChanged, поэтому WPF не знает, что изменило это свойство. Однако, если вы не изменяете значения во время выполнения, это не должно быть проблемой.

Кроме того, лучше вернуть Binding.DoNothing вместо того, чтобы бросать исключение NotImplementedException.

Вы также можете удалить Режим = По умолчанию извне, это не требуется.

Я вижу, что вы привязываетесь к списку, содержащему теги. Но почему вы не связываете контактный лист? Вы должны либо установить все через код, либо использовать привязки (и я предпочитаю привязки).

Если вы можете предоставить более подробную информацию о реальной проблеме, возможно, я могу помочь вам лучше.

+0

Спасибо за ваш ответ извините за неопределенный вопрос. Поэтому я не изменяю значения во время выполнения, поэтому я не реализовал INotifyPropertyChanged. Фактическая проблема заключается в том, как привязать LabelName в моей таблице тегов к количеству, сколько раз это имя появляется в моей коллекции? – Ben

0

Бен, все еще я не уверен в проблеме, с которой вы сталкиваетесь;

Что именно происходит при запуске кода? Изменен ли размер шрифта вашего названия ярлыка или нет?

Проблемы я вижу в вашем коде -

1 Вы устанавливаете ItemsSource для tagsList как в XAML и код -

ItemsSource = "{Binding Ярлыки, Mode = По умолчанию}"

tagsList.ItemsSource = lcv.Groups;

2 Я не вижу свойства ItemCount, определенного в любом месте?

3 FontSize - это двойное значение, поэтому ваш конвертер должен возвращать двойные значения, а не int.

4 Ваш список ярлыков должен быть наблюдаемой коллекцией (в случае, если элементы могут быть добавлены или удалены во время выполнения).