将ListBoxItem的CharacterCasing转换为UpperCase

时间:2014-08-23 20:57:06

标签: c# wpf listbox

我在网上看过很多关于我的问题的文章,但到处都有相同的答案:使用转换器。

其中一个可以找到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>

UPDATE2:

<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>

UPDATE3:

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; }
}

UPDATE4:

<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>

1 个答案:

答案 0 :(得分:0)

最简单的方法是创建一个转换器 (这不是用VS写的,所以请注意它只是一个样本

  public class ToUpperCaseConverter : IValueConverter 
  {
     ///
  }


  <Border Name="Border" Padding="5,2" SnapsToDevicePixels="true" CornerRadius="3" >
      <ContentPresenter Content="{Binding Path=MenuItemName,Converter={StaticResource uppercaseConverter}" />
  </Border> 

编辑:试试这个:

 <DataTemplate>
    <TextBlock Text="{Binding  Path=Content,RelativeSource={RelativeSource AncestorType=ListBoxItem}, Converter={StaticResource toUpperCaseConverter}}" />
 </DataTemplate>