我正在自学一些.NET编程,目前我正试图在WPF中构建一个标记云控件。目标是在窗口中有两个列表框,其中第一个列表框显示“ContactLists”列表,第二个列表框显示与ContactLists关联的“标签”(或标记)。对于标签,目的是使用itemCount将字体大小绑定到IValueConverter,因此如果我有一个特定的标签(在集合中出现了几次),这将在标签列表框中以更大的字体显示。此外,我还将从DB2数据库中填充控件。
因此,我已经在正确的列表框中显示了ContactLists和标签,我只是在绑定方面遇到了一些问题。我正在使用一个转换器类,这是我从一个教程,并想知道是否有人可以帮助我得到这项工作。非常感谢-本
性质
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>发布于 2011-01-12 10:29:51
你对你的问题不太清楚,所以我只想说几句话。
问题是您的模型(Label和ContactList)没有实现INotifyPropertyChanged,所以WPF很难知道这样的属性发生了什么变化。但是,如果您不在运行时更改值,则应该不会有问题。
另外,最好返回Binding.DoNothing,而不是抛出NotImplementedException。
您也可以从任何地方删除Mode=Default,这不是必需的。
我看到您正在绑定到包含标记的列表框。但是你为什么不把联系人列表也绑定起来呢?您应该通过代码设置所有内容,或者使用绑定(我更喜欢绑定)。
如果你能提供更多关于实际问题的细节,也许我可以帮助你更好。
发布于 2011-01-12 12:30:19
本,我还是不知道你面临的问题是什么;
当您运行代码时,到底发生了什么?标签名的字体大小是否已更改?
我能从你的代码中看出问题-
1在XAML和代码中为您的ItemsSource设置tagsList -
ItemsSource=“{绑定标签,Mode=Default}”
tagsList.ItemsSource = lcv.Groups;
2我没有看到在任何地方定义的ItemCount属性?
3 FontSize是一个双值,所以转换器应该返回双值而不是int。
4您的“标签”列表应该是一个可观察的集合(以防在运行时添加或删除项)。
https://stackoverflow.com/questions/4667641
复制相似问题