2017-12-02 32 views
0

MVVMを使用している私のWPFアプリケーションでは、ViewModelからObservableCollectionがバインドされたDataGrid(dgSelectCase)が1つあります。クリックすると、選択した行を2番目のDataGrid(dgCaseSelected)に追加するボタンが最初の列に表示されます。WPF MVVM DataGridから別のDataGrid行へ

View DataContextはそのコードビハインドでViewModelにバインドされており、ページ上の他のコントロール(Comboboxes、Textboxesなど)が完全に機能するため、ViewModelが機能することがわかりました。 dgSelectCaseの「Add」ボタンコマンドはViewModelのAddToメソッドにバインドされ、dgCaseSelectedの「Remove」ボタンコマンドはViewModelのRemoveFromメソッドにバインドされます。

「追加」ボタンは機能しませんが、重要なことに、行をクリックするとDataGridの周りに赤いボックスが表示されるため、選択肢がdgSelectCase DataGridのバインドの問題があるように見えます。どこが間違っていたのですか?私はまだゆっくりと学んでいるように、すべての助けをありがとう。以下はコードスニペットです。

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> 

のViewModel

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); 
     } 
    } 

答えて

0

まず第一に、あなたがにデータグリッドの選択した項目のプロパティをバインドしようとしているどのようにあなたのコードの中で言及されませんでしたあなたのコレクション(実際には、実際には、最初のデータグリッドのitemsourceを設定していない)、私はあなたが実際にはDataGridのプロパティは読み取り専用のプロパティなので、これからは2つしか選択肢がありません。選択したアイテムをビューモデルに送信する回避策を見つけるか、単一の行で作業します。あなたは、ボタンのコマンドを使用して、このオブジェクトを処理します。そこから

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

:あなたのVMで

<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> 

がDGSelectedCaseBookingsを削除し、次の行を追加します。第二のアプローチについては、単にこれを行うことができます。 INotifyPropertyChangedを必ず実装してください。そうしないと、UIに変更が表示されません。

複数の選択を行う場合、最も簡単な方法は、データグリッドの選択変更イベントを処理することです。そこから、このようなことをすることができます。

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    MyVM vm = this.DataContext as MyVM; 
    DataGrid s = sender as DataGrid; 
    vm.DGSelectedCaseBookings = s.SelectedItems; 
} 
0

この背景では、ボタンをクリックして現在の行(イベントのパラメータなど)を追加するとイベントを設定できます。現在の行をデータソース/ ObservableCollectionから選択し、別のデータセット、たとえば_dgSelectedCaseBookingsに追加します。

その後、UIで新しい_dgSelectedCaseBookingsを更新することができます。

関連する問題