2012-01-08 13 views
14

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:

enter image description here

Pero cuando hago clic para editar y entrar en el cuadro combinado, aquí es lo que se muestra:

enter image description here

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; } 
    } 
} 
+0

No se le debe volver a utilizar la misma instancia de unión para diferentes fijaciones ... –

Respuesta

3

enlazar el ItemsSource al valor seleccionado, una cadena, también conocida como matriz de caracteres, por lo que cada carácter se utiliza como un elemento, el enlace ItemsSource presumiblemente debería estar dirigido a otra colección de la cual el valor puede ser osen

+0

Ahhh sí que tiene sentido! Gracias por la info! Agregué el código para que el origen del artículo provenga ahora de una colección diferente. Los elementos en el cuadro combinado aparecen como deberían. Una cosa más, sin embargo, cuando selecciono un valor diferente del combobox, el bloque de texto no se actualiza con el nuevo elemento. ¿Cómo arreglaría eso? –

+0

@EricR .: vincula el 'SelectedItem' o' SelectedValue' a 'Account'. Use 'SelectedItem' si los elementos ya son las cadenas que deben usarse como valor para la cuenta, use [' SelectedValue'] (http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives .selector.selectedvalue.aspx) en combinación con [ 'SelectedValuePath'] (http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvalue.aspx) si el valor es una propiedad en el elemento seleccionado (y no el elemento en sí). –

+0

¿Cómo haría eso? La nueva colección para Cuentas que estoy usando es una ObservableCollection . Ahora estoy configurando ItemsSource con esto: comboFactory.SetValue (ComboBox.ItemsSourceProperty, this.Accounts) ;. esto.Cuentas es la ObservableCollection. Entonces, ¿cómo establecería el SelectedItem para eso? ¡Realmente aprecio toda la ayuda que me han brindado hasta ahora! –

0
Dim newBind As Binding = New Binding("LinktoCommonOutputBus") 
newBind.Mode = BindingMode.OneWay 

factory1.SetValue(ComboBox.ItemsSourceProperty, dictionary) 
factory1.SetValue(ComboBox.NameProperty, name) 
factory1.SetValue(ComboBox.SelectedValuePathProperty, "Key") 
factory1.SetValue(ComboBox.DisplayMemberPathProperty, "Value") 
factory1.SetBinding(ComboBox.SelectedValueProperty, newBind) 

Al crear Encuadernación, puede establecer SelectedValue en una cuadrícula de datos para WPF.