2015-08-06 2 views
1

У меня есть столбец ComboBox внутри DataGrid. Мне нужно отображать значения на основе другого элемента управления WPF, а не в DataGrid. Таким образом, значения ComboBox должны изменяться в соответствии с этим контролем. Я создал ObservableCollection и привязал его к ComboBox, но он не отображает никаких значений. Для динамического отображения я добавил DropOpenOpened событие. Но ComboBox не отображает значения. Список, который заполняет ComboBox, обновляется, но не отображает ничего.Combobox (внутри DataGrid) Связывание с наблюдаемым списком не загружается

Ниже приведен код xaml. DataGrid привязан к другому List, значения которого я извлекаю из БД.

<DataGrid x:Name="grid1" AutoGenerateColumns="False" Grid.Row="1" Grid.RowSpan="2" Grid.Column="1" Grid.ColumnSpan="2" 
    AlternatingRowBackground="Azure" AlternationCount="2" CanUserReorderColumns="True" CanUserResizeRows="True" CanUserSortColumns="True" 
       DataContext="attr">    
     <DataGrid.Columns> 
      <DataGridTextColumn Width="*" Binding="{Binding modify_user}" Header="Modified By" IsReadOnly="True"></DataGridTextColumn> 
      <DataGridTextColumn Width="*" Binding="{Binding modify_date}" Header="Modified Date" IsReadOnly="True"></DataGridTextColumn> 
      <DataGridTemplateColumn Header="Source" Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding source_value}"></TextBlock> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
       <DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <ComboBox x:Name="combo_source" ItemsSource="{Binding Path=sourceComboDropdown}"           
            DisplayMemberPath="desc" SelectedValuePath="id" 
            SelectedItem="{Binding source_value}" 
            SelectedValue="{Binding Path=source_value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"       
            DropDownOpened="combo_source_DropDownOpened"/>          
        </DataTemplate> 
       </DataGridTemplateColumn.CellEditingTemplate> 
      </DataGridTemplateColumn> 

      <DataGridTemplateColumn Header="Target value" Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding target_value}"></TextBlock> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
       <DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding targetComboDropdown}"          
            DisplayMemberPath="desc" SelectedValuePath="id" 
            SelectedItem="{Binding target_value}" 
            SelectedValue="{Binding Path=target_value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
            DropDownOpened="ComboBox_DropDownOpened"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellEditingTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

Класс ObservableCollection является:

public static ObservableCollection<Source> sourceComboDropdown = 
    new ObservableCollection<Source>(); 
public static ObservableCollection<Source> targetComboDropdown = 
    new ObservableCollection<Source>(); 

public class Source 
{ 
    public string id { get; set; } 
    public string desc { get; set; } 
} 

Где desc это значение DisplayMember и id является SelectedValue.

Класс для DataGrid списка:

public static ObservableCollection<Attribute_Param> attr = 
    new ObservableCollection<Attribute_Param>(); 

public class Attribute_Param 
{ 
    public string source_value { get; set; } 
    public string target_value { get; set; } 
    public string modify_user { get; set; } 
    public DateTime modify_date { get; set; } 
} 

Я попытался добавить статический ресурс. Но так как мне нужно динамически обновлять значения, я не мог бы найти работу, чтобы использовать ее. Я думаю, что мне не хватает чего-то действительно маленького, но не могу понять, что.

ответ

1

Я думаю, что он не может найти список sourceComboDropdown, поскольку dataContext DataGrid - это attr, который не содержит CONTIIN sourceCombo.

Я установил бы datacontext datagrid для всей модели. i.e DataGrid.DataContext=model в конструкторе кода позади.

Затем я могу привязать datagrid к attr, используя: ItemsSource="{Binding attr}" внутри тега DataGrid. Предполагая, что attr немедленно находится в модели VieWModel. Таким образом, он должен уметь обнаруживать элементы combo box soruce, которые теперь находятся в контексте данных. I.e модель содержит sourceDropDown.

Если то не работает, попробуйте следующее:

<DataGridTemplateColumn > 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate > 
           <ComboBox Loaded="LoadItemsSource"/> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 


    private void LoadItemsSource(object sender, RoutedEventArgs e) 
     { 

      ComboBox comboBox = sender as ComboBox; 


      comboBox.ItemsSource=model.sourceDropDown; 

     } 
+1

Эй Спасибо! Я попробовал второе решение, и оно работает! Я очень долго боролся с этой проблемой! Если бы были только неограниченные обороты! ;) – Mrunal

+0

, если только: D //// –

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