2016-03-01 4 views
-2

У меня есть объекты списка (PropertyBase - это базовый тип с Key и Value), которые я хочу показать пользователям в каком-то формате формы. На основе типа объекта я хочу переключаться между различными элементами управления. Скажем, int, double значения представлены с Label s, где значения string будут доступны для редактирования через TextBox. Аналогично, я хочу отобразить ComboBox для значений enum.WPF - Templatize Список объектов, основанных на их типе

До сих пор я читал около DataTemplate s, ContentPresenter и придумывал следующую часть кода xaml. Однако нижеприведенный шаблон отображает тип объекта (PropertyBase[Int64], PropertyBase[String]), а не его значение. Что в этом плохого?

<ItemsControl ItemsSource="{Binding Path=Properties}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate DataType="models:PropertyBase"> 
      <Grid Margin="0,0,0,5"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="*"/> 
       </Grid.ColumnDefinitions> 
       <Label Grid.Column="0" Content="{Binding Key}" /> 
       <ContentPresenter Grid.Column="1" Content="{Binding}"> 
        <ContentPresenter.Resources> 
         <DataTemplate DataType="{x:Type system:Int64}"> 
          <Label Content="{Binding}" /> 
         </DataTemplate> 
         <DataTemplate DataType="{x:Type system:String}"> 
          <TextBox Text="{Binding Value, Mode=TwoWay}" /> 
         </DataTemplate> 
        </ContentPresenter.Resources> 
       </ContentPresenter> 
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

ответ

0

Проблема связана с привязкой данных. ContentPresenter не был правильно привязан. <ContentPresenter Grid.Column="1" Content="{Binding}"> привязывается к источнику тока (ref). Источник тока PropertyBase класс, который содержит Key и Value. ContentPresenter пытался показать класс PropertyBase, позвонив по телефону ToString, а не используя Value Я бы хотел представить.

Использование <ContentPresenter Grid.Column="1" Content="{Binding Path=Value}"> решает проблему.