2013-03-07 3 views
0

이것은 내 첫 번째 게시물입니다. 질문을 게시하는 방법에 대한 조언을 환영합니다. SelectedItem이 변경 될 때 View Model에 알리기 위해 바운드 WPF Datagrid의 마지막 행을 얻으려면 어떻게해야합니까?

은 내가 속성이라고 OrderDetails의에 바인딩 ItemsSource을 가지고 WPF DataGrid (OrderDetails의 목록) 및 SelectedItem이 CurrentOrderDetail라는 속성에 바인딩합니다.

CurrentOrderDetail 속성 내에서 계산을 수행하는 메서드를 호출합니다. 계산을 수행하는 메소드는 OrderDetails 등록 정보를 반복하고 해당 목록에 속한 각 OrderDetail의 두 구성원을 곱하여 총 비용을 산출합니다. 이 메서드는 텍스트 상자가 폼에 바인딩 된 다른 속성을 업데이트하기 만하면됩니다.

이 모든 것이 효과적입니다. DataGrid의 마지막 행이 나올 때까지 좋습니다. 기본적으로 사용자는 첫 번째 행에서 시작하여 인보이스 필드를 클릭하고 수량을 입력 한 다음 Enter를 눌러 다음 행을 선택합니다. SelectedItem이 변경되어 CurrentOrderDetail - calling calculate를 업데이트합니다. 이 작품! 사용자는 DataGrid의 마지막 레코드가 히트 될 때까지 OK를 계산하는 모든 과정을 반복합니다. Invoiced 셀에서 편집을 마치려면 Enter 키를 누르면 calculate 메서드가 호출되지 않습니다. SelectedItem은 변경되지 않았으므로 CurrentOrderDetail 속성은 절대로 업데이트되지 않습니다.

저는 WPF/Silverlight와 MVVM으로 최근에 옮겨온 표준을 좋아해요. 나는 뒤돌아 보지 않았습니다. 따라서이 앱을 같은 방식으로 유지하려고합니다.

나는 SelectedItem을 바꾸기 위해 무언가를 강제 할 필요가 있다고 생각합니다. 보기에서 이벤트에 연결하고 단순히 탐색을 강요하는 방법에 대해 생각해 보았지만 조금 엉망이되었습니다. 더 나은 해결책이 있어야합니다. 나는 이틀이나 다른 포럼을 보냈으며 여러 아이디어를 시도해 보았습니다. 그 중 어떤 것도 작동하지 않았습니다.

속성 알림을 실행하기 위해 다른 행으로 이동하도록 사용자에게 요청할 수는 있지만, 그렇지 않을 수도 있습니다.

<DataGrid Name="grdData" Grid.Row="3" Grid.ColumnSpan="2" AutoGenerateColumns="False" CanUserAddRows="False" Margin="5,5,5,5" ItemsSource="{Binding Path=OrderDetails, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding Path=CurrentOrderDetail, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" BorderThickness="3" > 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=Part}" Header="Wyandot Part #" IsReadOnly="True" /> 
     <DataGridTextColumn Binding="{Binding Path=SupplierPartNumber}" Header="Supplier Part #" IsReadOnly="True" /> 
     <DataGridTextColumn Binding="{Binding Path=UnitPrice, StringFormat=c}" Header="Price" IsReadOnly="True" /> 
     <DataGridTextColumn Binding="{Binding Path=Account}" Header="Account" IsReadOnly="True" /> 
     <DataGridTextColumn Binding="{Binding Path=UDF5, Mode=TwoWay}" Header="Invoiced" IsReadOnly="False" /> 
    </DataGrid.Columns> 
</DataGrid> 

과 관련있는 내보기 모델의 조각 :

여기에 단지 DataGrid에 대한 XAML입니다.

Private m_orderDetails As List(Of OrderDetail) 
Public Property OrderDetails As List(Of OrderDetail) 
    Get 
     Return m_orderDetails 
    End Get 
    Set(value As List(Of OrderDetail)) 
     m_orderDetails = value 
     InvokePropertyChanged("OrderDetails") 
    End Set 
End Property 

Private m_currentOrderDetail As OrderDetail 
Public Property CurrentOrderDetail As OrderDetail 
    Get 
     Return m_currentOrderDetail 
    End Get 
    Set(value As OrderDetail) 
     m_currentOrderDetail = value 
     InvokePropertyChanged("CurrentOrderDetail") 
     Calculate() 
    End Set 
End Property 

Public Sub Calculate() 
    Dim total As Decimal = 0 

    For Each detail As OrderDetail In OrderDetails 
     total += detail.UnitPrice * detail.UDF5 
    Next 

    PoTotal = CStr("$" & total.ToString) 
End Sub 
+0

IObservable 사용을 고려 했습니까? http://msdn.microsoft.com/en-us/library/dd990377.aspx –

답변

0

잘못 변경된 이벤트에서 계산이 발생하는 것 같습니다. 사용자가 업데이트하는 OrderDetail 값 속성을 사용하면 속성 변경 이벤트가 발생하고이를 사용하여 내 총계를 업데이트 할 수 있습니다.

OrderDetail의 각 속성 변경 이벤트를 구독하려면 조금 더 많은 작업이 있지만, 그게 당신이 정말로 신경 쓰는 것입니다. 아마도 ObservableCollection<OrderDetail>을 사용하고 Collectionchanged 이벤트 와이어에서 필요한 리스너를 사용합니다.

+0

두 가지 모두에 대한 응답으로, 나는 생각했지만 Entity에서 돌아 왔을 때 (그 부분을 떠났다 - 죄송합니다 - LINQ to Entity 사용)은 ICollection (Of OrderDetail) (Details)을 포함하는 OrderHeader 개체 (Master)입니다. ICollection을 반복하여 관찰 가능한 컬렉션에 추가 할 수 있다고 생각합니다. 저장하기 전에 OrderHeader의 IColleciton으로 변경 사항을 다시 보내 주면됩니다. –

+0

나는 당신의 고통을 느낍니다. 나는 이와 비슷한 이유 때문에 언제나 완벽하게 좋은 EF 객체를 포장하고 있음을 발견했다.그러나 결국에는 분리 층을 추가하는 것이 거의 항상 내 인생을 편하게 만듭니다. –

+0

실제로! 도와 주셔서 감사합니다! 감사합니다! –