【问题标题】:Combobox(inside a DataGrid) Binding to Observable List not loading组合框(在 DataGrid 内)绑定到可观察列表未加载
【发布时间】:2015-10-29 23:34:18
【问题描述】:

我在DataGrid 中有一个ComboBox 列。我需要它来显示基于另一个 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; }
}

我已尝试添加静态资源。但是由于我需要动态更新这些值,所以我想不出一个解决方法来使用它。 我想我错过了一些非常小的东西,但不知道是什么。

【问题讨论】:

    标签: c# wpf xaml combobox datagrid


    【解决方案1】:

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

    我会将我的数据网格数据上下文设置为整个视图模型。即后面代码的构造函数中的DataGrid.DataContext=model

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

    【讨论】:

    • 嘿,谢谢!我尝试了第二种解决方案,它有效!我在这个问题上挣扎了很长时间。!如果只有无限的赞成票! ;)
    猜你喜欢
    • 2016-11-08
    • 2011-02-16
    • 2013-05-21
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多