Переключение Listviews с шаблонами в app.xaml? - PullRequest
0 голосов
/ 29 февраля 2012

Я сделал 2 просмотра списка 1 с изображением + имя и фамилия и 1, которые только отображают изображения (на панели Wrap в просмотре списка). Первый:

  <ListView x:Name="lsvsomething" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" GotFocus="lsv_GotFocus" SelectionChanged="lsv_selectionchanged" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="auto">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Image HorizontalAlignment="Center" VerticalAlignment="Center" Width="50" Height="50" Source="{Binding image}" Stretch="Fill"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Width="auto" DisplayMemberBinding="{Binding name}">
                        <GridViewColumnHeader Content="name" Tag="name" Click="SortClick"/>
                    </GridViewColumn>
                    <GridViewColumn Width="auto" DisplayMemberBinding="{Binding lastname}">
                        <GridViewColumnHeader Content="lastname" Tag="lastname" Click="SortClick" />
                    </GridViewColumn>
                </GridView>
            </ListView.View>
    </ListView>

Второй (только изображения):

 <ListView x:Name="lsvsomething" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" GotFocus="lsv_GotFocus" SelectionChanged="lsv_selectionchanged" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListView.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel Orientation="Horizontal" />
                        </ItemsPanelTemplate>
                    </ListView.ItemsPanel>
                    <ListView.View>
                        <GridView>
                            <GridViewColumn Width="60">
                                <GridViewColumn.CellTemplate>
                                    <DataTemplate>
                                        <Image HorizontalAlignment="Center" VerticalAlignment="Center" Width="50" Height="50" Source="{Binding image}" Stretch="Fill"/>
                                    </DataTemplate>
                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
                        </GridView>
                    </ListView.View>
  </ListView>

Теперь у них обоих есть ListView.View, я хочу поместить их в "шаблон?" в app.xaml, но я понятия не имел, как я могу это сделать. Второй ListView также использует ItemsPanelTemplate, чтобы сделать его панелью обтекания. Я нашел, как я могу сохранить этот файл в app.xaml (ItemsPanel = "{DynamicResource somename}"). Однако я использую этот просмотр списка в окнах с несколькими окнами, поэтому я хочу сохранить их оба (сделать шаблоны для них обоих?) В приложении. XAML файл. Тогда я также должен иметь возможность переключать их во время выполнения. (Источник предметов установлен в "коде")

1 Ответ

1 голос
/ 01 марта 2012

«шаблон» действительно не является точным определением.Я предполагаю, что вы действительно хотите иметь возможность повторного использования представлений списка.Есть несколько опций

Опция 1 (предпочтительно) Поместить каждый ListView в UserControl.Это будет отдельный XAML-файл с элементом в корне и его единственным дочерним элементом (нет необходимости в панели, поскольку у вас есть только один элемент. XAML будет выглядеть следующим образом:

<UserControl x:Class="SO.NameAndImageList"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="300"
    >
    <ListView ...>
        ...
    </ListView>
</UserControl>

Чтобы использовать этот UserControl, определите «локальное» пространство имен для указания на ваш код:

<Window ...
    xmlns:local"clr-namespace:SO">

    ...
    <local:NameAndImageList />
    ...
</Window>

Опция 2 Создайте DataTemplate, который представляет пользовательский типкоторый представляет ваш список.

В коде (обычно это называется ViewModel, в модели MVVM) определите следующий тип:

public class PersonCollection : ObservableCollection<Person> { }

Ваш тип происходит от ObservableCollection of Person (класс, содержащий элемент), без добавления. Это просто псевдоним, который может понять XAML. Затем в файле app.xaml, внутрив разделе, определите следующий шаблон:

<DataTemplate TargetType="{x:Type local:PersonCollection}" x:Key="ImageAndNameTemplate">
    <ListBox ...>
        ...
    </ListBox>
</DataTemplate>

Для повторного использования просто перетащите данные PersonCollection (обычно это будут данные из DataContext) на любую панель или используйте привязку в ContentControl:

<Window ... >
    <Window.DataContext>
        <!-- Instantiate the data. There are many other ways to do that -->
        <local:PersonCollection>
            <local:Person Name="..." Image="..." />
            <local:Person Name="..." Image="..." />
            <local:Person Name="..." Image="..." />
            ...
        </local:PersonCollection>
    </Window.DataContext>

    ...
    <ContentControl Content="{Binding}" ContentTemplate="{StaticResource ImageAndNameTemplate}" />

</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...