ListView быстрое переключение отображения

345
23 декабря 2016, 11:03

Потребовалось мне иметь возможность быстро и просто менять отображение элементов в ListBox. Конечно же в нем все очень неудобно, если отображение часто приходится менять, добавлять новые шаблоны и тд. Тогда я начал смотреть в сторону ListView с его свойством View.

Однако в интернетах очень мало информации о его использовании и она очень скудна. На MSDN только поверхностное описание.

Вот тут больше, но многое опять же непонятно. Там переопределили класс ViewBase, добавив в него свойство public DataTemplate ItemTemplate. Но я не могу понять каким образом это свойство применяется, ведь в ViewBase его нет, а значит его как то нужно посылать в ListView.ItemTemplate. Но как это сделано, там не сказано.

К тому же нужно так же на бегу менять панель (ItemsPanelTemplate). Где то нужна WrapPanel, где то StackPanel, где то вообще UniformGrid.

Следуя логике, я добавил в свой класс наследник от ViewBase свойство ItemsPanelTemplate PanelTemplate. Но что делать с этим дальше? Короче как мне добиться того, чтобы я меняю у ListView свойство View, указав на ресурс, и у меня полностью меняется отображение ListView (панели и всех элементов)?

Answer 1

Если я правильно понял вопрос, вам нужно такое:

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

READ ALSO
Работа с параметрами приложения

Работа с параметрами приложения

На данный момент параметр сохраняется так

246
Можно ли в DatagridView запретить для редактирования все строки кроме последней?

Можно ли в DatagridView запретить для редактирования все строки кроме последней?

Можно ли в DatagridView запретить для редактирования все строки кроме последней?

384
HtmlAgilityPack DocumentNode.SelectNodes() не возвращает данные

HtmlAgilityPack DocumentNode.SelectNodes() не возвращает данные

Есть страница с резюме (https://ekbzarplata

348
Не компилируется Release версия проекта

Не компилируется Release версия проекта

Не понимаю где искать ошибку Debug отрабатывает отлично

394