ゴール
モデル、ビュー、ビューモデル (MVVM) の方法を使用して、カスタム クラス オブジェクト (DamagedItems) のリストを DataGrid に追加します。
ユーザーが損傷部品 (機械の検査で不適切と見なされた) のエントリを作成できるようにしたい。
私がやった事
私が作成しました:
- ウィンドウ:に設定されているwDamagedItems.xaml
DataContext
DamagedItemViewModel
- モデル:実装するDamagedItemModel.vb
INotifyPropertyChanged
- ViewModel: DamagedItemViewModel.vbなどのクラスのプロパティを設定します。
DamagedItemModel
- ObservableCollection: DamagedItemList.vbを継承します。
ObservableCollection(Of DamagedItemModel)
私の DataContext はDamagedItemViewModelに設定されているため、プロパティを設定する方法は次のとおりです。
Public Class DamagedItemViewModel
Private _DamagedItem As DamagedItemModel
Private _Add As ICommand
Private _DamagedItems As DamagedItemList
Public Property DamagedItem As DamagedItemModel
Get
Return _DamagedItem
End Get
Set(value As DamagedItemModel)
_DamagedItem = value
End Set
End Property
Public Property DamagedItems As DamagedItemList
Get
Return _DamagedItems
End Get
Set(value As DamagedItemList)
_DamagedItems = value
End Set
End Property
Public Property Add As ICommand
Get
Return _Add
End Get
Set(value As ICommand)
_Add = value
End Set
End Property
Public Sub New()
DamagedItem = New DamagedItemModel("", "", "")
DamagedItems = New DamagedItemList
Add = New DamagedItemAddEntryCommand(Me)
End Sub
Public Function CanUpdate() As Boolean
If DamagedItem.Description = "" Then Return False
If DamagedItem.Initiales = "" Then Return False
Return True
End Function
Public Sub AddEntry()
DamagedItems.Add(DamagedItem) 'Items get added to the datagrid
DamagedItem = New DamagedItemModel 'Does not seem to clear textboxes
End Sub
End Class
XAML の設定方法は次のとおりです。
<DataGrid ItemsSource="{Binding Path=DamagedItems}" AutoGenerateColumns="True" HorizontalAlignment="Stretch" Margin="12,90,12,0" Name="DataGrid1" VerticalAlignment="Top" Height="229" / >
<TextBox Text="{Binding DamagedItem.Description, UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left" Margin="88,24,0,0" VerticalAlignment="Top" Width="249" />
<TextBox Text="{Binding DamagedItem.Initiales, UpdateSourceTrigger=PropertyChanged}" Height="23" HorizontalAlignment="Left" Margin="88,58,0,0" VerticalAlignment="Top" Width="249" />
ご覧のとおり、テキスト ボックスはモデル (そのウィンドウの DataContext にバインドされている ViewModel に含まれています) にバインドされています。「追加」ボタンをクリックするたびに、テキスト ボックスの内容はすべて DataGrid に追加されますが、テキスト ボックスの内容はそこにとどまります。
このステップは問題ありません。追加したいものを書き込んで「追加」をクリックします
「追加」をクリックすると、DataGrid に次の結果が表示されます。これで問題ありません。問題は、テキスト ボックスがまだデータで満たされているにもかかわらず、モデルがクリアされていることです ( DamagedItemViewModel AddEntry
メソッドの後のコードを参照してください)。
次のテキストを追加しようとすると:
- 説明: 「パーツが曲がっています」
- イニシャル: " AC "
次の結果が得られます。
説明に入力された最初の文字が DataGrid の最初のエントリに入力され、説明テキスト ボックスのテキストが消去されます。そうして初めて、自分のやりたいことを入力し続けることができます。イニシャル テキスト ボックスについても同じことが起こります。
何か案は?私のコードをもっと見たい場合は、追加すべき部分を提案してください。
前もって感謝します!