Преобразовать символьный регистр ListBoxItem в UpperCase

1

Я прочитал много статей в Интернете относительно моей проблемы, но везде я получил тот же ответ: используйте конвертер.

Один из них можно найти здесь.

Хорошо использовать конвертер, если в вашем приложении меньше 5 списков.

Скажем, у меня есть 100 списков в приложении WPF. Затем я хотел бы применить characterCasing к стилю, который используется этими списками. В этом случае мне, вероятно, понадобится способ, который не использует Конвертер.

Я думаю, что могу получить это, используя прикрепленное свойство. Я не уверен, могу ли я использовать прикрепленные свойства в стилях. Если я смогу использовать их, тогда я создам прикрепленное свойство. Но я не знаю, когда устанавливать или как устанавливать characterCasing для ListBoxItem.

Обновить:

ListBox:

<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>
  • 0
    Под регистром подразумевается заглавная буква в начале каждой строки?
  • 0
    @eranotzap Нет, не только первый персонаж. Я имею в виду, что все буквы должны быть заглавными.
Показать ещё 9 комментариев
Теги:
wpf
listbox

1 ответ

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>
  • 0
    Нет, он не работает, выдает ошибку, в которой говорится, что для ссылки на объект не задан экземпляр объекта, и его вполне понятно, так как RelativeSource AncestorType = ListBoxItem будет искать родителя ListBox типа ListBoxItem и не сможет его найти.
  • 0
    Это Parent на каком-то уровне ListBoxItem, вы запускали его или только видели исключение xaml?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню