2013-02-01 6 views

risposta

6

È possibile utilizzare una DataGridTemplateColumn combinato con un paio di trigger per ottenere questa funzionalità.

Questa è un'applicazione demo che associa un DataGrid a un elenco di tipi di controllo (stringa). La prima colonna mostra solo la stringa del tipo di controllo e la seconda colonna agisce sulla stessa informazione per presentare il controllo corrispondente. Potreste essere in grado di rendere il codice XAML un po 'più conciso, ma questo è il jist di esso:

Il XAML:

<Window x:Class="DataGridWithMultipleTypesPerColumn.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <DataGrid ItemsSource="{Binding ControlTypes}" 
       AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
     <DataGridTextColumn Header="Control Type" Binding="{Binding}"/> 
      <DataGridTemplateColumn Header="Actual Control"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ContentControl> 
          <ContentControl.Style> 
           <Style TargetType="ContentControl"> 
            <Style.Triggers> 
             <DataTrigger Binding="{Binding}" Value="TextBox"> 
              <Setter Property="ContentTemplate"> 
               <Setter.Value> 
                <DataTemplate> 
                 <TextBox Text="Default Text"/> 
                </DataTemplate> 
               </Setter.Value> 
              </Setter> 
             </DataTrigger> 
             <DataTrigger Binding="{Binding}" Value="CheckBox"> 
              <Setter Property="ContentTemplate"> 
               <Setter.Value> 
                <DataTemplate> 
                 <CheckBox Content="Check Box"/> 
                </DataTemplate> 
               </Setter.Value> 
              </Setter> 
             </DataTrigger> 
             <DataTrigger Binding="{Binding}" Value="Button"> 
              <Setter Property="ContentTemplate"> 
               <Setter.Value> 
                <DataTemplate> 
                 <Button Content="Button"/> 
                </DataTemplate> 
               </Setter.Value> 
              </Setter> 
             </DataTrigger> 
            </Style.Triggers> 
           </Style> 
          </ContentControl.Style> 
         </ContentControl> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

Codice-dietro e Vista Modello:

namespace DataGridWithMultipleTypesPerColumn 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = new ViewModel(); 
     } 
    } 

    public class ViewModel 
    { 
     public ObservableCollection<string> ControlTypes 
     { 
      get; 
      private set; 
     } 
     public ViewModel() 
     { 
      ControlTypes = new ObservableCollection<string>() { "Button", "TextBox", "CheckBox" }; 
     } 
    } 
} 
+1

grazie ragazzo, posso farlo ora. Ho trovato un'istruzione che è abbastanza facile da capire: http://code.msdn.microsoft.com/mag201104DataPoints. Non cerco ancora le tue istruzioni, ma sembra sensato. – kidgu

+0

Come funziona questo con l'associazione dei dati al controllo che selezioniamo dinamicamente? – bgura

+1

Come possiamo rendere il lavoro vincolante in questo caso? Ad esempio, hai questo: , ma come leghiamo la proprietà Text a qualcosa? Il problema è che questo TextBox non ha DataContext e non vede il datacontext del genitore. – nightcoder

Problemi correlati