2015-09-10 4 views
1

Привет Я довольно новичок в WPF так голый со мной. У меня возникают трудности с comboboxcolumn в сетке данных, я хочу, чтобы значение, которое было отображено и отредактировано, взято из объекта данных, используемого остальной сетью данных, и значения для раскрывающегося списка, взятого из другого объекта данных. У меня есть список comboboxdropdown, но у меня возникают трудности с его отображением из контекста строки сетки данных.DatagridComboBoxColumn не отображает значение

Вот мой макет

<StackPanel Orientation="Horizontal"> 
     <Label>Sheet date:</Label> 
     <DatePicker/>  
    </StackPanel> 
    <DataGrid x:Name="gridTimesheets" Height="205" Margin="4, 4, 4, 0" AutoGenerateColumns="False" > 
     <DataGrid.Columns> 
      <DataGridTextColumn IsReadOnly="True" Header="No." Width="40" Binding="{Binding ItemNumber }"></DataGridTextColumn> 

      <DataGridComboBoxColumn Width="120" Header="WorksorderID" x:Name="worksorderColumn"      
      SelectedValueBinding="{Binding Path=WorksorderID}" SelectedValuePath="WorksorderID" 
      DisplayMemberPath="WONA">     
      </DataGridComboBoxColumn> 

      <DataGridTextColumn Header="Time On" Width="60" Binding="{Binding TimeOn}"></DataGridTextColumn> 
      <DataGridTextColumn Header="Time Off" Width="60" Binding="{Binding TimeOff}"></DataGridTextColumn> 
      <DataGridTextColumn IsReadOnly="True" Header="Duration" Width="65" Binding="{Binding Duration}"></DataGridTextColumn> 
      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Button Content="Delete" x:Name="btnDelete" 
          Click="btnDelete_Click"></Button> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

     </DataGrid.Columns> 
    </DataGrid> 
    <Button Content="Add" Margin="4, 4, 4, 0" Click="btnAdd_Click"></Button> 
    <Button Content="Export" Margin="4, 4, 4, 4" ></Button> 
</StackPanel> 

Вот мой код

namespace Timesheet 
{ 

public partial class MainWindow : Window 
{ 

    TimesheetDatabase.TimesheetDB timesheetdb = new TimesheetDatabase.TimesheetDB(); 
    EFACSDatabase.EFACSDB efacsdb = new EFACSDatabase.EFACSDB(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
     gridTimesheets.ItemsSource = timesheetdb.GetTimesheetItems(); 
     worksorderColumn.ItemsSource = efacsdb.GetOrderItems(); 

    } 

OrderItem

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.ComponentModel; 

namespace EFACSDatabase 
{ 
public class OrderItem : INotifyPropertyChanged 
{ 
    private string orderid; 
    public string OrderID 
    { 
     get { return orderid; } 
     set 
     { 
      orderid = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("OrderID")); 
     } 
    } 

    private string wona; 
    public string WONA 
    { 
     get { return wona; } 
     set 
     { 
      wona = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("WONA")); 
     } 
    } 

    private string partid; 

    public string PartID 
    { 
     get { return partid; } 
     set 
     { 
      partid = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("PartID")); 
     } 
    } 

    private string customer; 
    public string Customer 
    { 
     get { return customer; } 
     set 
     { 
      customer = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("Customer")); 
     } 
    } 

    private string description; 

    public string Description 
    { 
     get { return description; } 
     set 
     { 
      description = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("Description")); 
     } 

    } 

    public OrderItem(string orderid, string wona, string partid, string customer, string description) 
    { 
     OrderID = orderid; 
     WONA = wona; 
     PartID = partid; 
     Customer = customer; 
     Description = description; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, e); 
    } 
} 
} 

TimesheetIt эм

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.ComponentModel; 

namespace TimesheetDatabase 
{ 
public class TimesheetItem : INotifyPropertyChanged 
{ 

    private int timesheetitemid; 
    public int TimesheetItemID 
    { 
     get { return timesheetitemid; } 
     set 
     { 
      timesheetitemid = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("TimesheetItemID")); 
     } 
    } 

    private int timesheetid; 
    public int TimesheetID 
    { 
     get { return timesheetid; } 
     set 
     { 
      timesheetid = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("TimesheetID")); 
     } 
    } 

    private int itemnumber; 
    public int ItemNumber 
    { 
     get { return itemnumber; } 
     set 
     { 
      itemnumber = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("ItemNumber")); 
     } 
    } 



    private TimeSpan timeon; 
    public TimeSpan TimeOn 
    { 
     get { return timeon; } 
     set 
     { 
      timeon = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("TimeOn")); 
     } 
    } 

    private TimeSpan timeoff; 
    public TimeSpan TimeOff 
    { 
     get { return timeoff; } 
     set 
     { 
      timeoff = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("TimeOff")); 
     } 
    } 
    private String worksorderid; 
    public String WorksorderID 
    { 
     get { return worksorderid; } 
     set 
     { 
      worksorderid = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("WorksorderID")); 
     } 
    } 


    private double duration; 
    public double Duration 
    { 
     get { return duration; } 
     set 
     { 
      duration = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("Duration")); 
     }  
    } 

    public TimesheetItem(int timesheetitemid, int timesheetid, int itemnumber, TimeSpan timeon, TimeSpan timeoff, String worksorderid, double duration) 
    { 
     TimesheetItemID = timesheetitemid; 
     TimesheetID = timesheetid; 
     ItemNumber = itemnumber; 
     TimeOn = timeon; 
     TimeOff = timeoff; 
     WorksorderID = worksorderid; 
     Duration = duration; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, e); 
    } 
} 
} 

Я пытаюсь получить combobox для отображения значения из GetTimesheetItems и позволяет пользователю изменить это значение из выпадающего используя значения из GetOrderItems.

Спасибо за любую помощь

+0

Ваш код сравнивает WorkorderID строки строки с WONA comboBox. лучше вы меняете выделенноеValuePath на WorkorderID (должно быть свойство itemsSource выпадающего списка) –

+0

Хорошо, я изменил это, его значение пока не отображается. Спасибо за вашу помощь – user1412672

+0

Поскольку comboBox itemssource - это OrderItems, selectedValuePath должен быть OrderID, а затем вы хотите сопоставить OrderId с Row's WorkorderID, поэтому SelectedValueBinding должен быть выполнен для WorkorderID.просто измените selectedValuePath & inform. –

ответ

0

Я думаю, что это то, что вам нужно:

<DataGridComboBoxColumn Width="120" 
         Header="WorksorderID" 
         x:Name="worksorderColumn"      
         SelectedValueBinding="{Binding Path=WorksorderID}" 
         SelectedValuePath="WONA" 
         DisplayMemberPath="WONA">     
</DataGridComboBoxColumn> 
  • SelectedValueBinding связан с WorksorderID свойства TimesheetItem объекта, который является пунктом в DataGrid. Это означает, что при выборе одного элемента из комбо его значение (определенное SelectedValuePath) будет присвоено свойству WorksorderID элемента DataGrid.
  • SelectedValuePath имеет свойство WONA объекта OrderItem, выбранного на ComboBox. Это указывает на то, что значение каждого элемента в комбо определяется его свойством WONA, что по вашему мнению, соответствует WorksorderID ...
  • И аналогично, DisplayMemberPath устанавливается в WONA свойстве OrderItem объектов, содержащихся на раскрывающийся список ComboBox. Это просто выбирает свойство, которое вы хотите визуализировать внутри комбо, для каждого элемента.

EDIT: Если у вас есть проблемы с комбо порожняком в начальной загрузке, а затем инвертировать порядок, на котором вы загружаете элементы. Я имею в виду, сначала загрузите элементы ComboBoxColumn, а затем элементы DataGrid.

public MainWindow() 
{ 
    InitializeComponent(); 
    worksorderColumn.ItemsSource = efacsdb.GetOrderItems(); 
    gridTimesheets.ItemsSource = timesheetdb.GetTimesheetItems(); 
} 
+0

Это не сработало. Теперь вместо хранения WorksorderID хранится идентификатор OrderID. Поле со списком работает, выбирая значение, и выбор значения записывается обратно. Проблема, с которой я сталкиваюсь, заключается в том, что при первоначальной загрузке сетки данных значение является порядком работы, пока не будет изменено. Спасибо за вашу помощь. – user1412672

+0

Хорошо, я отредактировал свой ответ, чтобы использовать свойство 'WONA' вместо' OrderID'. Я также добавил предложение для вашей проблемы, когда комбо не загружается initally: сначала загружайте элементы комбо, прежде чем загружать элементы DataGrid. – almulo

+1

Thats работал, это был заказ, который я загружал по своим предметам, спасибо! – user1412672

Смежные вопросы