Tengo una Datagrid dinámica que he creado. Estoy creando cada columna para ello a través del código detrás. Tengo problemas en una columna que quiero que se muestre en un bloque de texto cuando no se está editando, pero como un cuadro combinado mientras se está editando. Tengo una ObservableCollection of Transactions. Cada transacción tiene un tipo llamado "Cuenta". Esto es lo que tengo hasta ahora:Crear DataGridTemplateColumn a través de C# Code
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;
}
El valor se muestra en el TextBlock. Sin embargo, en el cuadro combinado, solo estoy obteniendo un personaje para mostrar por artículo. Por ejemplo, aquí está el bloque de texto:
Pero cuando hago clic para editar y entrar en el cuadro combinado, aquí es lo que se muestra:
Alguien me puede ayudar a cabo de manera que los elementos en el Combobox se muestran correctamente? Además, cuando selecciono algo de Combobox, el bloque de texto no se actualiza con el elemento que seleccioné.
Actualizado:
Aquí es mi columna a partir de ahora. Los elementos en el ComboBox se muestran correctamente. El problema ahora es que cuando se selecciona un nuevo elemento, el texto en el TextBlock no se actualiza con el nuevo 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 propiedad "cuentas" se declara como esto en mi clase 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();
}
Aquí es mi Transacción Clase:
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; }
}
}
No se le debe volver a utilizar la misma instancia de unión para diferentes fijaciones ... –