【问题标题】:Setting the SelectedItemBinding on a DataGridComboBoxColumn在 DataGridComboBoxColumn 上设置 SelectedItemBinding
【发布时间】:2018-10-16 18:21:58
【问题描述】:

我试图在我的 WPF 数据网格中有一个组合框字段,组合框中的选项来自 SharePoint 列表。我已经设法将选项放入组合框中,但它没有监听 SelectedItemBinding 设置,并且每个项目的值都显示为空白。 DataGrid 的数据也来自 SharePoint 列表,但已转换为 ObservableCollection。这是 XAML:

<DataGrid Name="dgVendorSchedule" Grid.Column="1" Grid.Row="2" Grid.ColumnSpan="3" 
              AutoGenerateColumns="False"
              SelectionChanged="dgVendorSchedule_SelectionChanged"
              EnableRowVirtualization="True" 
              IsReadOnly="False" 
             >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Title" Binding="{Binding title, Mode=TwoWay}" />
            <!-- <DataGridTextColumn Header="Vendor" Binding="{Binding vendorName, Mode=TwoWay}" />-->
            <DataGridComboBoxColumn x:Name="cmbVendor" 
                                    Header="Vendor"
                                    SelectedValueBinding="{Binding vendorName}"
                                    DisplayMemberPath="Title">
            </DataGridComboBoxColumn>
            <DataGridTextColumn Header="Billing Date" Binding="{Binding billingDate, Mode=TwoWay}" />
            <DataGridTextColumn Header="Payment" Binding="{Binding paymentTitle, Mode=TwoWay}"/>
            <DataGridTextColumn Header="Invoice" Binding="{Binding invoiceTitle, Mode=TwoWay}"/>
        </DataGrid.Columns>
    </DataGrid>

下面是代码:

        var lstVendors = (from i in colVendorSched.AsEnumerable<SP.ListItem>()
                          select new vendor
                          {
                              vendorName = ((SP.FieldLookupValue)i["Vendor"]).LookupValue,
                              billingDate = ((DateTime)i["Billing_x0020_Date_x0020__x0028_"]).ToLocalTime(),
                              itemID = (int)i["ID"],
                              title = (string)i["Title"],
                              //using the ? operator to trap null values on the lookup field before retrieving the lookupvalue property 
                              invoiceTitle = i["Invoice"] == null ? "" : ((SP.FieldLookupValue)i["Invoice"]).LookupValue,
                              paymentTitle = i["Payment"] == null ? "" : ((SP.FieldLookupValue)i["Payment"]).LookupValue
                          });

        var lstVendorList = (from i in colVendorList.AsEnumerable<SP.ListItem>()
                             select new
                             {
                                 Title = i["Title"],
                                 ID = i["ID"]
                             });

        cmbVendor.ItemsSource = lstVendorList;

        ObservableCollection<vendor> obsVendors = new ObservableCollection<vendor>(lstVendors);

        dgVendorSchedule.ItemsSource = obsVendors;

我对使用 WPF 还很陌生,坦率地说,这种绑定的东西让我头疼。我会很感激任何指示。

编辑:为了后代...解决方案结果是为 vendorItem 创建一个类,并使其成为 vendor 类的成员,如下所示:

public class vendor
{
    public VendorItem vendorName {get; set;}
    public DateTime billingDate {get; set;} 
    public int itemID {get; set;}
    public string title {get; set;} 
    public string invoiceTitle  {get; set;}
    public string paymentTitle { get; set; }
}

public class VendorItem
{
    public string Title { get; set; }
    public int ID { get; set; }
}

这使得设置 selectedValuePath 并让绑定正常工作成为可能。这是该列的有效 XAML:

<DataGridComboBoxColumn x:Name="cmbVendor" 
                                    Header="Vendor"
                                    SelectedValueBinding="{Binding vendorName.ID}"
                                    SelectedValuePath="ID"
                                    DisplayMemberPath="Title"                                        >
            </DataGridComboBoxColumn>

【问题讨论】:

  • 您没有显示组合框代码,也没有更改选择的处理。没有这个,我无能为力。
  • 组合框代码在此处的数据网格部分中:` ` 我还没有处理选择更改事件。那是明天的工作:)
  • 等等...现在我看到您可能正在谈论数据网格“dvVendorSchedule_SelectionChanged”上的 SelectionChanged 事件。该事件与组合框列无关。它在页面的另一个窗格中设置了一些详细信息。

标签: c# wpf data-binding


【解决方案1】:

SelectedValueBinding 和 SelectedItemBinding 用于绑定回后端。它将选择设置为后面的变量(UI --> Back-end)。

您的问题可能是 DisplayMemberPath 无法使用匿名对象。您可以尝试将其包装在一个类中吗:

var lstVendorList = (from i in colVendorList.AsEnumerable<SP.ListItem>()
                     select new Vendor
                     {
                         Title = i["Title"],
                         ID = i["ID"]
                     });

public class Vendor
{
    public string Title { get; set; }
    public string ID { get; set; }
}

在这种情况下,您也可以去掉 DisplayMemberPath 并直接覆盖 Vendor class 的 ToString()。

为了更好地理解组合框,您应该使用look here。 在这种情况下,您一定缺少SelectedValuePath

【讨论】:

  • 这是个好主意。虽然仍然得到相同的结果。组合框已填充列表中的项目,但未显示该列的值。
  • 哦,但是你这样做是错误的。您是否尝试使用组合框列出可能的供应商,但已根据显示的行选择了它?
  • 是的..这就是我想要做的。这是一个 !screenshot 显示供应商的两列。第一个是其中包含 VendorName 的原始 DataGridTextColumn。该数据是从共享点查找字段中提取的。我现在想将其更改为 DataGridComboBoxColumn,因此如果您想编辑该字段,您可以使用下拉列表进行操作。这意味着它应该是一个选择了现有值的组合框。
  • 我很欣赏这个链接,但我认为我们可能在谈论不同的事情。到目前为止,我对组合框没有任何问题。我已经多次使用它们,并且能够很好地设置它们的 itemssource、selectedvaluepath 和 displaymember 路径。事实上,这就是为什么我发现设置这个 DataGridComboBoxColumn 的问题如此令人烦恼。与常规绑定常规组合框相反,嵌入在数据网格中的组合框似乎工作方式不同。我尝试在 Xaml 和后面的代码中设置 SelectedValuePath,但没有任何结果。
  • 好的!我得到了它!事实证明,摆脱匿名类型是成功的一半。一旦我这样做了,我就可以将该类型包含在我的供应商列表类型中,并为该列设置 ID 和标题,这反过来意味着我可以将 SelectedValuePath 设置为 ID,它现在可以工作了。感谢您为我指明正确的方向。
猜你喜欢
  • 2015-08-06
  • 2016-12-30
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 2017-09-08
  • 2013-12-27
  • 1970-01-01
  • 2010-12-26
相关资源
最近更新 更多