如何在wpf datagrid中绑定一个组合框?

时间:2013-12-19 21:52:36

标签: c# .net wpf data-binding combobox

如何在wpf datagrid中绑定组合框(Itemssource和所选项目)?我正在使用MVVM模式。 我试过了

<DataGridTemplateColumn Header="Example 9">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding PartIds, RelativeSource={RelativeSource AncestorType=Window}}" SelectedItem="{Binding PartId, UpdateSourceTrigger=PropertyChanged}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

   <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding MyCars}" HorizontalAlignment="Left">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Model" Binding="{Binding Model}"/>
                    <DataGridTextColumn Header="Registration" Binding="{Binding Registration}"/>

                    <DataGridTemplateColumn Header="Example 12">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding CarParts, RelativeSource={RelativeSource AncestorType=Window}}" DisplayMemberPath="PartName" SelectedValuePath="PartID"  SelectedValue="{Binding PartId, UpdateSourceTrigger=PropertyChanged}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTextColumn Header="Selected" Binding="{Binding PartId}"/>

                </DataGrid.Columns>
            </DataGrid>

用于数据绑定的属性

#region DataGrid List<String> Example

        public ObservableCollection<MyCar> MyCars { get; set; }
        public List<string> PartIds { get; set; } 

        #endregion

        #region DataGrid List<Class> Example

        public List<CarPart> CarParts { get; set; }

        #endregion

参考: http://code.msdn.microsoft.com/windowsdesktop/Best-ComboBox-Tutorial-5cc27f82

4 个答案:

答案 0 :(得分:6)

我尝试了很多选项,但我找到的最简单的选项是生成该组合框的加载事件&amp;将它与列表或数据表绑定。

e.g。  在Xaml

 <DataGridTemplateColumn.CellEditingTemplate>
       <DataTemplate>
                  <ComboBox x:Name="cmbPayee" Loaded="cmbPayee_Loaded" Text="{Binding PayeeName, NotifyOnSourceUpdated=True,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValue ="{Binding PayeeID, NotifyOnSourceUpdated=True,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  DisplayMemberPath = "Payee1" SelectedValuePath="PayeeID"/>
      </DataTemplate>

在.cs代码中

private void cmbPayee_Loaded(object sender, RoutedEventArgs e)
    {
        ComboBox cmb = (ComboBox)sender;
            var res = from k in db.Payees
                      select k;
            cmb.ItemsSource = res.ToList();
            cmb.DisplayMemberPath = "Payee1";
            cmb.SelectedValuePath = "PayeeID";

    }

答案 1 :(得分:1)

尝试制作列表可观察的集合。您需要确保在将新对象添加到您的收藏集时,您的属性会告诉您的用户界面,这是ObservableCollection为您所做的事情。

另外,请确保您的CarPartMyCar班级实施INotifyPropertyChanged

这是否是您的问题取决于何时设置了您的属性。

答案 2 :(得分:1)

因为我不在我的开发站,只是猜测,但尝试使用ElementName按名称而不是相对来源引用窗口...

类似的东西:

ItemsSource="{Binding CarParts,ElementName=MyWindowName}"

并在窗口定义中添加Name =“MyWindowName”。

答案 3 :(得分:0)

只需使用此操作系统.cs端

DataContext = CarParts;