Я прочитал много статей в Интернете относительно моей проблемы, но везде я получил тот же ответ: используйте конвертер.
Один из них можно найти здесь.
Хорошо использовать конвертер, если в вашем приложении меньше 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>
Проще всего сделать, это создать конвертер
(это не было написано в 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>