Привязка данных IValueConverter - PullRequest
       8

Привязка данных IValueConverter

0 голосов
/ 12 января 2011

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

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

Свойства

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
    }

Событие загрузки окна

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>

Ответы [ 2 ]

0 голосов
/ 12 января 2011

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

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

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

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

ItemsSource = "{Метки привязки, Mode = Default} "

tagsList.ItemsSource = lcv.Groups;

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

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

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

0 голосов
/ 12 января 2011

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

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

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

Вы также можете удалить Mode = Default из любого места, это не обязательно.

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

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

...