1

ゴール

モデル、ビュー、ビューモデル (MVVM) の方法を使用して、カスタム クラス オブジェクト (DamagedItems) のリストを DataGrid に追加します。

ユーザーが損傷部品 (機械の検査で不適切と見なされた) のエントリを作成できるようにしたい。

私がやった事

私が作成しました:

  • ウィンドウ:に設定されているwDamagedItems.xamlDataContextDamagedItemViewModel
  • モデル:実装するDamagedItemModel.vbINotifyPropertyChanged
  • 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 の最初のエントリに入力され、説明テキスト ボックスのテキストが消去されます。そうして初めて、自分のやりたいことを入力し続けることができます。イニシャル テキスト ボックスについても同じことが起こります。

古いクラスに追加された最初の文字

何か案は?私のコードをもっと見たい場合は、追加すべき部分を提案してください。

前もって感謝します!

4

1 に答える 1