Потребовалось мне иметь возможность быстро и просто менять отображение элементов в 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.
Продвижение своими сайтами как стратегия роста и независимости