【发布时间】:2014-08-23 20:57:06
【问题描述】:
我在网上阅读了很多关于我的问题的文章,但在任何地方我都得到了相同的答案:使用转换器。
其中一个可以找到here。
如果您的应用程序中的列表框少于 5 个,则可以使用转换器。
假设我在 WPF 应用程序中有 100 个列表框。然后我想将 characterCasing 应用于这些列表框使用的样式。在这种情况下,我可能需要一种不使用 Converter 的方法。
我想我可以通过使用附加属性来获得这个。我不确定是否可以在样式中使用附加的属性。如果我可以使用这些,那么我将创建一个附加属性。但我不知道什么时候设置或如何设置 ListBoxItem 的 characterCasing。
更新:
列表框:
<ListBox Grid.Column="1" ItemsSource="{Binding ParentMenuItems}"
DisplayMemberPath="MenuItemName" />
风格:
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource baseStyle}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Name="Border" Padding="5,2" SnapsToDevicePixels="true" CornerRadius="3" >
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Border" Property="Background" Value="{StaticResource BrushOrangeSelector}"/>
<!--<Setter TargetName="Border" Property="BitmapEffect">
<Setter.Value>
<DropShadowBitmapEffect ShadowDepth="2" Brush="#FFFF6A00" />
</Setter.Value>
</Setter>-->
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="BorderThickness" Value="0" />
</Style>
更新2:
<Style TargetType="{x:Type ListBox}">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding Path=., Converter={StaticResource toUpperCaseConverter}}" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
更新3:
public partial class MenuItem
{
public MenuItem()
{
this.MenuItems1 = new HashSet<MenuItem>();
}
public int MenuItemID { get; set; }
public string MenuItemName { get; set; }
public Nullable<int> ParentID { get; set; }
public virtual ICollection<MenuItem> MenuItems1 { get; set; }
public virtual MenuItem MenuItem1 { get; set; }
}
更新4:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Name="Border" Padding="5,2" SnapsToDevicePixels="true" CornerRadius="3" >
<TextBlock Text="{Binding Path=Content, RelativeSource={RelativeSource AncestorType=ListBoxItem}, Converter={StaticResource toUpperCaseConverter}}" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Border" Property="Background" Value="{StaticResource BrushOrangeSelector}"/>
<Setter TargetName="Border" Property="Effect">
<Setter.Value>
<DropShadowEffect ShadowDepth="0" Color="Orange" BlurRadius="10" />
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
【问题讨论】:
-
大小写是指每行开头的大写字母?
-
@eranotzap 不,不仅仅是第一个字符。我的意思是所有的字母都是大写的。
-
我猜您不想要转换器,因为您不知道 ItemTemplate 中将绑定什么文本?
-
@eranotzap 完全正确。这就是重点。
-
不一定我回答得很快...请发布您的列表框之一以及它们作为 ItemsSource 绑定的内容,如果转换器不是最佳解决方案,我会给您最好的解决方案我们可以通过在 ItemContainerStyle 中绑定到所有 TextBlock 的 Text 属性的附加属性轻松做到这一点。