Потребовалось мне иметь возможность быстро и просто менять отображение элементов в ListBox
. Конечно же в нем все очень неудобно, если отображение часто приходится менять, добавлять новые шаблоны и тд. Тогда я начал смотреть в сторону ListView
с его свойством View
.
Однако в интернетах очень мало информации о его использовании и она очень скудна. На MSDN только поверхностное описание.
Вот тут больше, но многое опять же непонятно. Там переопределили класс ViewBase
, добавив в него свойство public DataTemplate ItemTemplate
. Но я не могу понять каким образом это свойство применяется, ведь в ViewBase
его нет, а значит его как то нужно посылать в ListView.ItemTemplate
. Но как это сделано, там не сказано.
К тому же нужно так же на бегу менять панель (ItemsPanelTemplate
). Где то нужна WrapPanel
, где то StackPanel
, где то вообще UniformGrid
.
Следуя логике, я добавил в свой класс наследник от ViewBase
свойство ItemsPanelTemplate PanelTemplate
. Но что делать с этим дальше? Короче как мне добиться того, чтобы я меняю у ListView
свойство View
, указав на ресурс, и у меня полностью меняется отображение ListView
(панели и всех элементов)?
Если я правильно понял вопрос, вам нужно такое:
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="150" Width="150">
<Window.Resources>
<!-- определяем нужные шаблоны -->
<DataTemplate x:Key="Cyan">
<TextBlock Text="{Binding}" FontWeight="Bold" Foreground="DarkCyan"/>
</DataTemplate>
<DataTemplate x:Key="Red">
<TextBlock Text="{Binding}" FontStyle="Italic" Foreground="Red"/>
</DataTemplate>
</Window.Resources>
<Grid>
<!-- применяем один из них -->
<ListView ItemsSource="{Binding}" Name="LV" ItemTemplate="{StaticResource Red}"/>
<!-- кнопка для переключения -->
<Button Click="OnStyleChangeReq" VerticalAlignment="Bottom" Content="Change style"/>
</Grid>
</Window>
и code-behind:
bool red = true;
void OnStyleChangeReq(object sender, RoutedEventArgs e)
{
var template = (DataTemplate)FindResource(red ? "Cyan" : "Red");
red = !red;
LV.ItemTemplate = template;
}
Получается вот так:
Ну или можно переключать через триггеры и стили, если переключаться надо в зависимости от привязанных данных из VM.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Можно ли в DatagridView запретить для редактирования все строки кроме последней?
Есть страница с резюме (https://ekbzarplata