Список различных типов пользовательских элементов управления WPF - PullRequest
5 голосов
/ 24 октября 2011

У меня есть список WPF со встроенным пользовательским элементом управления JUC.

Это прекрасно работает, и, поскольку я очень новичок в WPF, это уже очень впечатляет. То, что я хотел бы сделать сейчас, это иметь различные пользовательские элементы управления в списке, основанные на связанном свойстве.

Возможно ли это? Если нет, как еще мне этого добиться?

Я использую список, потому что я хочу разрешить упорядочение пользовательских элементов управления с помощью перетаскивания и перетаскивания, поэтому будет иметь место переменное число, поэтому, кажется, имеет смысл - альтернативные подходы приветствуются.

<ListBox x:Name="peopleListBox" 
    HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch"
    ItemContainerStyle="{StaticResource ListBoxItemStretch}"
    Foreground="Transparent" 
    BorderBrush="Transparent" 
    Background="Transparent" 
    Grid.ColumnSpan="2" SelectionChanged="peopleListBox_SelectionChanged">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                     <my:JUC Margin="4"></my:JUC>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

1 Ответ

7 голосов
/ 24 октября 2011

Вы можете использовать DataTemplateSelector , в SelectTemplate () метод, который вы можете проверить, какой DataTemplate использовать для в настоящее время передается в элементе:

В XAML:

<!-- define templates in resources
     ChartDataTemplate is a ChartDataTemplate.xaml, the same for other
-->
<UserControl.Resources>
     <DataTemplate x:Key="ChartDataTemplate">
          <views:LineChartView />
     </DataTemplate>

     <DataTemplate x:Key="GridDataTemplate">
         <views:PieChartView />
     </DataTemplate>
</UserControl.Resources>

<!-- ListView Itemtemplate should point to template selector -->
<ItemsControl.ItemTemplate>     
  <DataTemplate>
      <ContentPresenter 
             ContentTemplateSelector = "{StaticResource MyTemplateSelector}">

В коде:

 private sealed class MyTemplateSelector: DataTemplateSelector
 { 

    public override DataTemplate SelectTemplate(
                                      object item, 
                                      DependencyObject container)
    {
        // 1. case item to your object which is bound to each ListView item
        // 2. based on object type/state return correct DataTemplate
        // as this.Resources["ChartDataTemplate"] or
        // this.Resources["GridDataTemplate"] 
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...