首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IValueConverter数据绑定

IValueConverter数据绑定
EN

Stack Overflow用户
提问于 2011-01-12 10:22:13
回答 2查看 1.1K关注 0票数 0

我正在自学一些.NET编程,目前我正试图在WPF中构建一个标记云控件。目标是在窗口中有两个列表框,其中第一个列表框显示“ContactLists”列表,第二个列表框显示与ContactLists关联的“标签”(或标记)。对于标签,目的是使用itemCount将字体大小绑定到IValueConverter,因此如果我有一个特定的标签(在集合中出现了几次),这将在标签列表框中以更大的字体显示。此外,我还将从DB2数据库中填充控件。

因此,我已经在正确的列表框中显示了ContactLists和标签,我只是在绑定方面遇到了一些问题。我正在使用一个转换器类,这是我从一个教程,并想知道是否有人可以帮助我得到这项工作。非常感谢-本

性质

代码语言:javascript
复制
public class Label
{
    public int LabelID { get; set; }
    public string LabelName { get; set; }

}

ContactListClass

代码语言:javascript
复制
public class ContactList    
    {           
        public string ContactListName { get; set; }
        public List<Label> Labels { get; set; }

    }  

变换器

代码语言:javascript
复制
   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
    }

窗口加载事件

代码语言:javascript
复制
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

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

发布于 2011-01-12 10:29:51

你对你的问题不太清楚,所以我只想说几句话。

问题是您的模型(Label和ContactList)没有实现INotifyPropertyChanged,所以WPF很难知道这样的属性发生了什么变化。但是,如果您不在运行时更改值,则应该不会有问题。

另外,最好返回Binding.DoNothing,而不是抛出NotImplementedException。

您也可以从任何地方删除Mode=Default,这不是必需的。

我看到您正在绑定到包含标记的列表框。但是你为什么不把联系人列表也绑定起来呢?您应该通过代码设置所有内容,或者使用绑定(我更喜欢绑定)。

如果你能提供更多关于实际问题的细节,也许我可以帮助你更好。

票数 0
EN

Stack Overflow用户

发布于 2011-01-12 12:30:19

本,我还是不知道你面临的问题是什么;

当您运行代码时,到底发生了什么?标签名的字体大小是否已更改?

我能从你的代码中看出问题-

1在XAML和代码中为您的ItemsSource设置tagsList -

ItemsSource=“{绑定标签,Mode=Default}”

tagsList.ItemsSource = lcv.Groups;

2我没有看到在任何地方定义的ItemCount属性?

3 FontSize是一个双值,所以转换器应该返回双值而不是int。

4您的“标签”列表应该是一个可观察的集合(以防在运行时添加或删除项)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4667641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档