【问题标题】:How to bind a combobox inside wpf datagrid?如何在 wpf 数据网格中绑定组合框?
【发布时间】:2014-01-08 15:41:03
【问题描述】:

如何在 wpf datagrid 中绑定(Itemssource 和 selected item)的组合框?我正在使用 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

【问题讨论】:

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


【解决方案1】:

只需使用这个 os .cs 端

DataContext = CarParts;

【讨论】:

    【解决方案2】:

    我尝试了很多选项,但我发现最简单的选项是生成该组合框的加载事件并将其与列表或数据表绑定。

    例如 在 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";
    
        }
    

    【讨论】:

      【解决方案3】:

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

      类似:

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

      并在窗口定义中添加一个 Name="MyWindowName"。

      【讨论】:

        【解决方案4】:

        尝试让您的 Lists 成为可观察的集合。您需要确保您的属性在新对象添加到您的集合时通知您的 UI,这就是 ObservableCollection 为您所做的。

        还要确保您的 CarPartMyCar 类实现 INotifyPropertyChanged

        这是否是您的问题取决于您的属性设置的确切时间。

        【讨论】:

          猜你喜欢
          • 2017-05-17
          • 2013-03-19
          • 2011-09-09
          • 2012-06-05
          • 2018-05-21
          • 2012-10-01
          • 1970-01-01
          • 2011-10-22
          • 1970-01-01
          相关资源
          最近更新 更多