Ho un DataGrid con un DataTable con come ItemsSource. Il numero di colonne differisce di volta in volta. Se il DataType di una colonna è di classe A, desidero utilizzare un DataTemplate per personalizzare l'aspetto del contenuto della cella.WPF DataGrid - DataBind alla cella DataTable in CellTemplates DataTemplate
Ho regolato
AutoGenerateColumns="True"
sul DataGrid in modo che tutte le colonne della DataTable verrà generato.
sostituisce la DataGridColumn con un DataGridTemplateColumn se il tipo di dati è di tipo A
private void DataGrid_AutoGeneratingColumn(object sender, system.Windows.Controls.DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyType == typeof(A))
{
e.Column = new DataGridTemplateColumn
{
CellTemplate = (DataTemplate)Resources["ATemplate"],
Header = e.Column.Header,
HeaderTemplate = e.Column.HeaderTemplate,
HeaderStringFormat = e.Column.HeaderStringFormat
};
}
}
DataTemplate assomiglia a questo.
<DataTemplate x:Key="ATemplate">
<RadioButton Content="{Binding Name}" GroupName="{Binding GroupName}" IsChecked="{Binding IsSelected}" />
</DataTemplate>
il pulsante radio è mostrato, ma ottengo gli errori vincolanti per tutte le proprietà, come
BindingExpression path error: 'IsSelected' property not found on 'object' ''DataRowView'
Classe A si presenta come questo
public class A
{
public string Name { get; set; }
public string GroupName { get; set; }
public bool IsSelected { get; set; }
}
Come posso DataBind DataTemplate verso destra cella e proprietà?
(Se si dispone di una soluzione MVVM in cui non devo usare DataGrid_AutoGeneratingColumn sarebbe bello)
EDIT
ho provato questa soluzione anche senza fortuna. Solo il nome di classe viene mostrato nella cella come al solito quando non sa come eseguire il rendering della classe.
<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Items}">
<DataGrid.Resources>
<DataTemplate DataType="{x:Type viewModel:A}">
<RadioButton Content="{Binding Path=Name}" GroupName="{Binding Path=GroupName}" IsChecked="{Binding Path=IsSelected}" />
</DataTemplate>
</DataGrid.Resources>
</DataGrid>
Sì, mi dispiace, mio mal ... non funzionerà. – Sheridan