2012-01-08 2 views
14

У меня есть динамический Datagrid, который я создал. Я создаю каждый столбец для него через код позади. У меня возникли проблемы с столбцом, который я хочу отображать в текстовом блоке, когда он не редактируется, но как комбобокс при редактировании. У меня есть ObservableCollection транзакций. Каждая транзакция имеет тип «Учетная запись». Вот что у меня есть до сих пор:Создать DataGridTemplateColumn через 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; 
    } 

Значение отображается в TextBlock. Однако в combobox я получаю только один символ для отображения для каждого элемента. Например, вот TextBlock:

enter image description here

Но когда я нажимаю редактировать и перейти в выпадающий список, вот то, что показано:

enter image description here

Может кто-то помочь мне так что элементы в Combobox отображаются правильно? Кроме того, когда я выбираю что-то из Combobox, текстовый блок не обновляется с выбранным мной элементом.

ОБНОВЛЕНО:

Вот моя колонка, как сейчас. Элементы в ComboBox отображаются правильно. Теперь проблема заключается в том, что при выборе нового элемента текст в TextBlock не обновляется новым элементом.

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

Свойство "Accounts" объявлен как это в моем классе 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(); 
    } 

Вот моя сделка Класс:

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

Вы не должны повторно использовать один и тот же экземпляр привязки для разных привязок ... –

ответ

3

Вы привязать ItemsSource к выбранному значению, строка, aka char array, поэтому каждый символ используется как элемент, привязка ItemsSource предположительно должна нацеливаться на другую коллекцию, из которой значение может быть ch Осен.

+0

Ahhh да, это имеет смысл! Спасибо за информацию! Я добавил код, чтобы источник items появился из другой коллекции. Элементы в поле со списком отображаются так, как должны. Еще одна вещь, однако, когда я выбираю другое значение из combobox, текстовый блок не обновляется новым элементом. Как я могу это исправить? –

+0

@EricR: Привязать 'SelectedItem' или' SelectedValue' к 'Account'. Используйте 'SelectedItem', если элементы уже являются строками, которые должны использоваться как значение для учетной записи, используйте [' SelectedValue'] (http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives .selector.selectedvalue.aspx) в сочетании с ['SelectedValuePath'] (http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvalue.aspx), если значение равно свойство для выбранного элемента (а не самого элемента). –

+0

Как мне это сделать? Новая коллекция для учетных записей, которую я использую, представляет собой ObservableCollection . Теперь я устанавливаю ItemSource следующим образом: comboFactory.SetValue (ComboBox.ItemsSourceProperty, this.Accounts) ;. this.Accounts - ObservableCollection. Итак, как бы я установил для этого SelectedItem? Я очень ценю всю помощь, которую вы мне дали до сих пор! –

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) 

Создав привязку, вы можете установить SelectedValue в datagrid для WPF.

Смежные вопросы