2017-12-02 2 views
0

In meiner WPF-Anwendung, die MVVM verwendet, habe ich ein DataGrid (dgSelectCase) gefüllt mit einer gebundenen ObservableCollection aus meinem ViewModel. In der ersten Spalte wird eine Schaltfläche angezeigt, die beim Klicken die ausgewählte Zeile dem zweiten DataGrid (dgCaseSelected) hinzufügen sollte.WPF MVVM DataGrid-Reihe zu einem anderen DataGrid

Der View DataContext ist an das ViewModel in seinem Code gebunden, und ich weiß, dass es funktioniert, weil die anderen Controls auf der Seite (Comboboxen, Textboxen usw.) perfekt funktionieren. Der "Hinzufügen" -Knopf-Befehl in dgSelectCase ist an die AddTo-Methode im ViewModel gebunden und der "Remove" -Button-Befehl in dgCaseSelected ist an die RemoveFrom-Methode im ViewModel gebunden.

Die Schaltfläche "Hinzufügen" funktioniert nicht, aber, noch wichtiger, es sieht so aus, als ob ich Auswahl Binding-Probleme im dgSelectCase DataGrid habe, weil ich ein rotes Feld um das DataGrid bekomme, wenn ich auf eine Zeile klicke. Wo bin ich falsch gelaufen? Danke für jede Hilfe, wie ich noch lerne ... langsam :). Im Folgenden sind Code-Snippets.

XAML

 <DataGrid> 
      <DataGrid.Columns> 
      <DataGridTemplateColumn Header="Select"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Button Content="Add" Command="{Binding AddTo}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTextColumn Header="Fac ID #" Binding="{Binding FacilityIDNum}"/> 
      <DataGridTextColumn Header="OP Case #" Binding="{Binding CaseBookingNum}"/> 
      <DataGridTextColumn Header="Booking Type #" Binding="{Binding BookingTypeNum}"/> 
      <DataGridTextColumn Header="Booking Type" Binding="{Binding BookingType}"/> 
      </DataGrid.Columns> 
     </DataGrid> 

     <DataGrid x:Name="dgCaseSelected" 
       AutoGenerateColumns="False" 
       ItemsSource="{Binding DGCaseBookingsSelected}" 
       > 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Select"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Button Content="Remove" Command="{Binding RemoveFrom}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTextColumn Header="Fac ID #" Binding="{Binding FacilityIDNum}"/> 
       <DataGridTextColumn Header="OP Case #" Binding="{Binding CaseBookingNum}"/> 
       <DataGridTextColumn Header="Booking Type #" Binding="{Binding BookingTypeNum}"/> 
       <DataGridTextColumn Header="Booking Type" Binding="{Binding BookingType}"/> 
      </DataGrid.Columns> 
     </DataGrid> 

Ansichtsmodell

private ObservableCollection<DGCaseBookings> _dgCaseBookingsList; 
    private ObservableCollection<DGCaseBookings> _dgSelectedCaseBookings; 
    private ObservableCollection<DGCaseBookings> _dgCaseBookingsSelected; 

    public ObservableCollection<DGCaseBookings> DGCaseBookingsList 
    { 
     get { return _dgCaseBookingsList; } 
     set 
     { 
      SetProperty(ref _dgCaseBookingsList, value,() => DGCaseBookingsList); 
     } 
    } 

    public ObservableCollection<DGCaseBookings> DGSelectedCaseBookings 
    { 
     get { return _dgSelectedCaseBookings; } 
     set 
     { 
      SetProperty(ref _dgSelectedCaseBookings, value,() => DGSelectedCaseBookings); 
     } 
    } 

    public ObservableCollection<DGCaseBookings> DGCaseBookingsSelected 
    { 
     get { return _dgCaseBookingsSelected; } 
     set 
     { 
      SetProperty(ref _dgCaseBookingsSelected, value,() => DGCaseBookingsSelected); 
     } 
    } 

    public CMBookingSelectVM() : base() 
    { 
     DGCaseBookingsList = new ObservableCollection<DGCaseBookings>(); 
     DGCaseBookingsSelected = new ObservableCollection<DGCaseBookings>(); 
    } 

    private void fillDGCaseBookingswithFacility() 
    { 
     using (MySqlConnection con = new MySqlConnection(dbConnectionString)) 
     { 
      DGCaseBookingsList = new ObservableCollection<DGCaseBookings>(); 
      con.Open(); 
      string Query = ///SELECT STATEMENT WORKS FINE/// 
      MySqlCommand createCommand = new MySqlCommand(Query, con); 
      MySqlDataReader dr = createCommand.ExecuteReader(); 
      int count = 1; 
      while (dr.Read()) 
      { 
       int FacilityIDNum = dr.GetInt32(0); 
       int CaseBookingNum = dr.GetInt32(1); 
       int BookingTypeNum = dr.GetInt32(2); 
       string BookingType = dr.GetString(3); 
       DGCaseBookings dgcb = new DGCaseBookings(count, FacilityIDNum, CaseBookingNum, BookingTypeNum, BookingType); 
       DGCaseBookingsList.Add(dgcb); 
       count++; 
      } 
      con.Close(); 
     } 
    } 

    public void AddTo(DGCaseBookings dgcb) 
    { 
     if (dgcb != null) 
     { 
      DGCaseBookingsSelected.Add(dgcb); 
      DGCaseBookingsList.Remove(dgcb); 
     } 
    } 

    public void RemoveFrom(DGCaseBookings dgcb) 
    { 
     if (dgcb != null) 
     { 
      DGCaseBookingsList.Add(dgcb); 
      DGCaseBookingsSelected.Remove(dgcb); 
     } 
    } 

Antwort

0

Zunächst einmal haben Sie nicht in Ihrem Code erwähnt, wie Sie versuchen, die ausgewählten Elemente Eigenschaft des Datagrid zu binden Ihre Sammlung (als eine Sache von Tatsachen, die Sie tatsächlich nicht einmal die itemsource für das erste Datagrid gesetzt haben), und ich denke, dass Sie das nicht taten, da Sie daswirklich nicht binden können 210 Eigenschaft des Datagrids, da es sich um eine schreibgeschützte Eigenschaft handelt. Von jetzt an hast du nur noch 2 Wahlmöglichkeiten. Suchen Sie nach einer Problemumgehung, um die ausgewählten Elemente an Ihr Ansichtsmodell zu senden oder an einer einzelnen Zeile zu arbeiten. Was den zweiten Ansatz können Sie einfach tun:

<DataGrid ItemsSource="{Binding DGCaseBookingsList}" SelectedItem="{Binding MyItem}" SelectionMode = "Single" SelectionUnit="FullRow"> 
     <DataGrid.Columns> 
     <DataGridTemplateColumn Header="Select"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Button Content="Add" Command="{Binding AddTo}"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTextColumn Header="Fac ID #" Binding="{Binding FacilityIDNum}"/> 
     <DataGridTextColumn Header="OP Case #" Binding="{Binding CaseBookingNum}"/> 
     <DataGridTextColumn Header="Booking Type #" Binding="{Binding BookingTypeNum}"/> 
     <DataGridTextColumn Header="Booking Type" Binding="{Binding BookingType}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

in Ihrer VM löschen DGSelectedCaseBookings und fügen Sie den folgenden:

private DGCaseBookings myItem = new DGCaseBookings(); 
public DGCaseBookings MyItem 
{ 
    get { return myItem; } 
    set 
    { 
     SetProperty(ref myItem, value,() => MyItem); 
    } 
} 

Von dort werden Sie diese Aufgabe übernehmen die Kontrolle über Ihre Tasten. Stellen Sie sicher, dass Sie INotifyPropertyChanged implementieren, sonst werden keine Änderungen in Ihrer Benutzeroberfläche angezeigt.

Wenn Sie auf eine Mehrfachauswahl abzielen, ist es am einfachsten, das Ereignis selection changed Ihrer Datagrids zu bearbeiten. Von dort aus kannst du so etwas machen.

0

Im Hintergrund können Sie das Ereignis einrichten, wenn Sie auf die Schaltfläche klicken und die aktuelle Zeile (wie Parameter des Ereignisses) hinzufügen. Wählen Sie die aktuelle Zeile aus der Datenquelle/ObservableCollection aus und fügen Sie sie in einem anderen Dataset hinzu, z. B. _dgSelectedCaseBookings.

Danach können Sie die neuen _dgSelectedCaseBookings auf UI aktualisieren.

Verwandte Themen