Combobox(在DataGrid中)绑定到Observable List而不加载

时间:2015-08-06 17:32:04

标签: c# wpf xaml combobox datagrid

我在ComboBox内有一个DataGrid列。我需要它来显示基于另一个WPF控件的值,而不是DataGrid。因此,ComboBox的值应根据该控件而变化。我创建了一个ObservableCollection并将其绑定到ComboBox,但它没有显示任何值。为了动态显示,我添加了DropOpenOpened个事件。但是ComboBox没有显示任何值。填充ComboBox的列表正在更新,但它没有显示任何内容。

以下是xaml代码。 DataGrid绑定到另一个List,其值是从DB获取的。

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

其中descDisplayMember值且idSelectedValue

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 个答案:

答案 0 :(得分:1)

我认为它无法找到列表sourceComboDropdown,因为DataGrid的dataContext是attr,它不包含sourceCombo下拉。

我将我的datagrid datacontext设置为整个viewmodel。即DataGrid.DataContext=model在后​​面的代码的构造函数中。

然后我可以使用DataGrid标记内的ItemsSource="{Binding attr}"将datagrid绑定到attr。假设attr立即出现在VieWModel模型中。这样它应该能够检测到现在在数据上下文中的组合框项目soruce,即模型包含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;

        }