Установка SelectedItemBinding для DataGridComboBoxColumn - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь добавить поле со списком в свою таблицу данных 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 и сделать его членом класса вендора, например:

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>

1 Ответ

0 голосов
/ 16 октября 2018

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 и просто переопределить ToString() Vendor class.

Чтобы лучше понять комбинированные списки, вам нужно взглянуть здесь .В этом случае вы должны пропустить SelectedValuePath

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...