ゴール
btnRefresh
テキストボックスに何かがあるときにボタンを有効にしたいtbMachineNo
(MVVM標準を使用)。
プロジェクトの概要
私は持っています:
Window.xaml
<TextBox Text="{Binding Inspection.Machine.MachineNumber, UpdateSourceTrigger=PropertyChanged}" />
<Button Command="{Binding RefreshMachineNo}" />
InspectionViewModel.vb
これにはプロパティがInspectionModel
あり、いくつかのメソッドが含まれています。1つは、コンストラクター中に ICommand が実行されることです(これが、CanUpdate
メソッドのためにテキストボックスを無効/有効にするものです)
Public Class InspectionViewModel
Private _Inspection As InspectionModel
Private _RefreshMachineNo As ICommand
Public Property Inspection As InspectionModel
Get
Return _Inspection
End Get
Set(value As InspectionModel)
_Inspection = value
End Set
End Property
Public Sub New()
_Inspection = New InspectionModel("Version", "Title of machine", "Model", "Owner", "Department", Date.Now, New MachineModel)
RefreshMachineNo = New RefreshMachineNumberCommand(Me) 'Calls the CanUpdate, and if it returns true, it executes FetchMachineDetails()
End Sub
Public Property RefreshMachineNo As ICommand
Get
Return _RefreshMachineNo
End Get
Set(value As ICommand)
_RefreshMachineNo = value
End Set
End Property
Public ReadOnly Property CanUpdate As Boolean
Get
If Inspection Is Nothing Then
Return False
End If
Return Not String.IsNullOrWhiteSpace(Inspection.Machine.MachineNumber)
End Get
End Property
Public Sub FetchMachineDetails()
Dim MachineNo As String = Inspection.Machine.MachineNumber
End Sub
End Class
これは正常に機能し、コードは必要なときに実行されます。InpsectionModel を見てみましょう。
RefreshMachineNumberコマンド
Public Class RefreshMachineNumberCommand
Implements ICommand
Private _viewModel As InspectionViewModel
Public Sub New(ByVal viewModel As InspectionViewModel)
_viewModel = viewModel
End Sub
Public Event CanExecuteChanged(sender As Object, e As System.EventArgs) Implements System.Windows.Input.ICommand.CanExecuteChanged
Public Function CanExecute(parameter As Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute
Return _viewModel.CanUpdate()
End Function
Public Sub Execute(parameter As Object) Implements System.Windows.Input.ICommand.Execute
_viewModel.FetchMachineDetails()
End Sub
End Class
InspectionModel.vb
このクラスは、 を実装する ObservableObject を継承しINotifyPropertyChanged
ます。したがって、理論的には、私のプロパティMachineNumber
が Inspection オブジェクトMachine
で変更されるたびに、UpdateSourceTrigger=PropertyChanged
Public Class InspectionModel
Inherits ObservableObject
Private _Version As String
Private _Title As String
Private _Model As String
Private _InspectionOwner As String
Private _Department As String
Private _DateEntry As Date
Private _Machine As MachineModel
Public Property Version As String
Get
Return _Version
End Get
Set(value As String)
_Version = value
Notify("Version")
End Set
End Property
Public Property Title As String
Get
Return _Title
End Get
Set(value As String)
_Title = value
Notify("Title")
End Set
End Property
Public Property Model As String
Get
Return _Model
End Get
Set(value As String)
_Model = value
Notify("Model")
End Set
End Property
Public Property InspectionOwner As String
Get
Return _InspectionOwner
End Get
Set(value As String)
_InspectionOwner = value
Notify("InspectionOwner")
End Set
End Property
Public Property Department As String
Get
Return _Department
End Get
Set(value As String)
_Department = value
Notify("Department")
End Set
End Property
Public Property DateEntry As Date
Get
Return _DateEntry
End Get
Set(value As Date)
_DateEntry = value
Notify("DateEntry")
End Set
End Property
Public Property Machine As MachineModel
Get
Return _Machine
End Get
Set(value As MachineModel)
_Machine = value
Notify("Machine")
End Set
End Property
Public Sub New(ByVal Version As String, ByVal Title As String, ByVal Model As String, ByVal InspectionOwner As String, ByVal Department As String, ByVal DateEntry As Date, ByVal Machine As MachineModel)
Me.Version = Version
Me.Title = Title
Me.Model = Model
Me.InspectionOwner = InspectionOwner
Me.Department = Department
Me.DateEntry = DateEntry
Me.Machine = Machine
End Sub
End Class
問題
テキストボックスに文字が入力されたとき、またはテキストボックスが空になったときに、ボタンコントロールを有効/無効にする方法を理解していません。私のCanUpdate
ICommand は、現在これを制御しているものであり、コンストラクターがロードされたときに 1 回だけ実行されます。
これは理にかなっていますが、コードの背後に置かずにこの Textchanged の問題を機能させる方法がわかりません。MVVMでできるようにしたい
Textbox を別のフィールドにバインドしましたが、そのフィールドは Inspection オブジェクトの同じ属性にバインドされていました。テキストボックスに入力したときに他のフィールドが変更されているのを見ることができました...したがって、UpdateSourceTriggerは機能していますが、テキストを入力するとボタンを有効にすることができません。