Ho un Datagrid dinamico che ho creato. Sto creando ogni colonna per esso attraverso il codice dietro. Ho problemi su una colonna che desidero visualizzare in un blocco di testo quando non si modifica, ma come una combobox durante la modifica. Ho una ObservableCollection of Transactions. Ogni Transazione ha un tipo chiamato "Account". Ecco cosa ho finora:Crea DataGridTemplateColumn attraverso il codice C#
private DataGridTemplateColumn GetAccountColumn()
{
// Create The Column
DataGridTemplateColumn accountColumn = new DataGridTemplateColumn();
accountColumn.Header = "Account";
Binding bind = new Binding("Account");
bind.Mode = BindingMode.TwoWay;
// Create the TextBlock
FrameworkElementFactory textFactory = new FrameworkElementFactory(typeof(TextBlock));
textFactory.SetBinding(TextBlock.TextProperty, bind);
DataTemplate textTemplate = new DataTemplate();
textTemplate.VisualTree = textFactory;
// Create the ComboBox
bind.Mode = BindingMode.OneWay;
FrameworkElementFactory comboFactory = new FrameworkElementFactory(typeof(ComboBox));
comboFactory.SetValue(ComboBox.DataContextProperty, this.Transactions);
comboFactory.SetValue(ComboBox.IsTextSearchEnabledProperty, true);
comboFactory.SetBinding(ComboBox.ItemsSourceProperty, bind);
DataTemplate comboTemplate = new DataTemplate();
comboTemplate.VisualTree = comboFactory;
// Set the Templates to the Column
accountColumn.CellTemplate = textTemplate;
accountColumn.CellEditingTemplate = comboTemplate;
return accountColumn;
}
Il valore viene visualizzato in TextBlock. Tuttavia, nella casella combinata, visualizzo solo un carattere per elemento. Ad esempio, ecco il blocco di testo:
Ma quando clicco per modificare e andare nella casella combinata, ecco ciò che viene mostrato:
Qualcuno mi può aiutare in modo che gli elementi nel Combobox sono visualizzati correttamente? Inoltre, quando seleziono qualcosa da Combobox, il blocco di testo non viene aggiornato con l'elemento selezionato.
aggiornamento:
Qui è la mia colonna, al momento. Gli elementi nel ComboBox vengono visualizzati correttamente. Il problema ora è che quando viene selezionato un nuovo elemento, il testo in TextBlock non viene aggiornato con il nuovo elemento.
private DataGridTemplateColumn GetAccountColumn()
{
// Create The Column
DataGridTemplateColumn accountColumn = new DataGridTemplateColumn();
accountColumn.Header = "Account";
Binding bind = new Binding("Account");
bind.Mode = BindingMode.OneWay;
// Create the TextBlock
FrameworkElementFactory textFactory = new FrameworkElementFactory(typeof(TextBlock));
textFactory.SetBinding(TextBlock.TextProperty, bind);
DataTemplate textTemplate = new DataTemplate();
textTemplate.VisualTree = textFactory;
// Create the ComboBox
Binding comboBind = new Binding("Account");
comboBind.Mode = BindingMode.OneWay;
FrameworkElementFactory comboFactory = new FrameworkElementFactory(typeof(ComboBox));
comboFactory.SetValue(ComboBox.IsTextSearchEnabledProperty, true);
comboFactory.SetValue(ComboBox.ItemsSourceProperty, this.Accounts);
comboFactory.SetBinding(ComboBox.SelectedItemProperty, comboBind);
DataTemplate comboTemplate = new DataTemplate();
comboTemplate.VisualTree = comboFactory;
// Set the Templates to the Column
accountColumn.CellTemplate = textTemplate;
accountColumn.CellEditingTemplate = comboTemplate;
return accountColumn;
}
La proprietà "Account" viene dichiarato come questo nella mia classe MainWindow:
public ObservableCollection<string> Accounts { get; set; }
public MainWindow()
{
this.Types = new ObservableCollection<string>();
this.Parents = new ObservableCollection<string>();
this.Transactions = new ObservableCollection<Transaction>();
this.Accounts = new ObservableCollection<string>();
OpenDatabase();
InitializeComponent();
}
Qui è la mia classe di transazione:
public class Transaction
{
private string date;
private string number;
private string account;
public string Date
{
get { return date; }
set { date = value; }
}
public string Number
{
get { return number; }
set { number = value; }
}
public string Account
{
get { return account; }
set { account = value; }
}
}
Non si dovrebbe riutilizzare la stessa istanza di bind per collegamenti diversi ... –