これは私の最初の投稿です - 必要に応じて質問を投稿する方法についてのアドバイスを歓迎します。
OrderDetails(List Of OrderDetails) というプロパティにバインドされ、CurrentOrderDetail というプロパティ にバインドされた WPFDataGrid
があります。ItemsSource
SelectedItem
CurrentOrderDetail プロパティ内で、計算を行うメソッドを呼び出します。計算を行うメソッドは、OrderDetails プロパティをループ処理し、そのリストに属する各 OrderDetail の 2 つのメンバーを乗算して合計コストを生成します。このメソッドは、フォーム上でテキスト ボックスがバインドされている別のプロパティを更新するだけです。
の最後の行に到達するまで、これはすべてうまく機能しDataGrid
ます。基本的に、ユーザーは最初の行から開始し、[請求済み] フィールドをクリックして数量を入力し、Enter キーを押して次の行を選択します。SelectedItem
変更により CurrentOrderDetail が更新され、計算が呼び出されます。これはうまくいきます!DataGrid
ユーザーは、最後のレコードがヒットするまで、すべての計算が OK であるプロセスを繰り返します。Invoiced セルの編集を終了するためにユーザーが Enter キーを押すと、calculate メソッドは呼び出されSelectedItem
ません。
私は標準が好きで、最近 WPF/Silverlight と MVVM に移行して以来、振り返っていません。そういうわけで、私はこのアプリを同じように維持しようとしています。
変更をトリガーするには、何かを強制する必要があると思いSelectedItem
ます。ビューのイベントにフックして、単にナビゲートを強制することを考えましたが、それは私には少し醜いようです。もっと良い解決策があるはずです。私はここや他のフォーラムで 2 日間過ごし、自分のアイデアをいくつか試しましたが、どれもうまくいきませんでした。
ユーザーに別の行に移動してプロパティ通知をトリガーするように求めることもできますが、そうはしません。
の XAML は次のDataGrid
とおりです。
<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>
そして、関連する私のView Modelからのスニペット。
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