【问题标题】:Convert the CharacterCasing of a ListBoxItem to UpperCase将 ListBoxItem 的 CharacterCasing 转换为 UpperCase
【发布时间】: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 属性的附加属性轻松做到这一点。

标签: c# wpf listbox


【解决方案1】:

最简单的事情就是创建一个转换器
(这不是用 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>

【讨论】:

  • 不,它不起作用,给我一个错误,说对象引用未设置为对象的实例,并且它很容易理解,因为 RelativeSource AncestorType=ListBoxItem 将查找 ListBox 类型为 ListBoxItem 的父级它找不到一个。
  • 它的 Parent 在某种程度上是一个 ListBoxItem ,你是运行它还是只看到 xaml 异常?
  • 我看到编译时错误,但 Visual-Studio 允许我运行该项目。我得到命名空间而不是输出中的实际数据。想一想:ListBoxItem 如何成为 ListBox 的父级?
  • @Vishal DataTemplate 替换了 ListBoxItem(控件)模板中的 ContentPresenter。并且 ListBox 包含 ListBoxItems 。
  • 糟糕!我正在为 ListBox 定义一个 ItemTemplate。无论如何我已经尝试过了,但我仍然得到命名空间而不是实际数据。要查看我是如何做到的,请检查我的问题中的 Update4。在那里我没有使用 dataTemplate 因为它给了我错误。错误是 Property Child 不支持 DataTemplate 类型的值。
猜你喜欢
  • 2012-08-07
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 2011-11-15
相关资源
最近更新 更多