2017-12-02 1 views
0

MVVM을 사용하는 WPF 응용 프로그램에서 ViewModel에서 바인딩 된 ObservableCollection으로 채워진 하나의 DataGrid (dgSelectCase)가 있습니다. 첫 번째 열에 Button이 나타나면 클릭하면 선택한 행이 두 번째 DataGrid (dgCaseSelected)에 추가됩니다.WPF MVVM DataGrid 다른 DataGrid 행

View DataContext는 ViewModel의 코드 배후에 바인딩되어 있으며 페이지의 다른 컨트롤 (Comboboxes, Textboxes 등)이 완벽하게 작동하기 때문에 작동합니다. 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> 

뷰 모델, 당신은 당신이 할 수있는 데이터 그리드의 선택한 항목의 속성을 결합하려고하는 방법 코드에서 언급하지 않은 모든

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

우선 귀하의 컬렉션 (실제로 당신이 실제로 첫 번째 DataGrid에 대한 itemsource를 설정하지 않은 사실), 그리고 당신이 실제로 이후바인딩 할 수 없기 때문에 그렇게 생각하지210 속성은 읽기 전용 속성이기 때문에 DataGrid의 속성에 영향을줍니다. 이제부터는 2 가지 선택 만 할 수 있습니다. 선택한 항목을 뷰 모델로 보내거나 단일 행으로 작업 할 수있는 해결 방법을 찾으십시오. 당신의 VM 삭제 DGSelectedCaseBookings에서

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

을하고 다음을 추가 : 두 번째 방법에 관해서는 당신은 간단하게이 작업을 수행 할 수 있습니다

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

은 거기에서 당신은 당신의 버튼의 명령을 사용하여이 개체를 처리합니다. 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을 새로 고칠 수 있습니다.