0

ゴール

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

問題

テキストボックスに文字が入力されたとき、またはテキストボックスが空になったときに、ボタンコントロールを有効/無効にする方法を理解していません。私のCanUpdateICommand は、現在これを制御しているものであり、コンストラクターがロードされたときに 1 回だけ実行されます。

これは理にかなっていますが、コードの背後に置かずにこの Textchanged の問題を機能させる方法がわかりません。MVVMでできるようにしたい

Textbox を別のフィールドにバインドしましたが、そのフィールドは Inspection オブジェクトの同じ属性にバインドされていました。テキストボックスに入力したときに他のフィールドが変更されているのを見ることができました...したがって、UpdateSourceTriggerは機能していますが、テキストを入力するとボタンを有効にすることができません。

4

2 に答える 2

1
  1. UpdateSourceTrigger が PropertyChanged に設定されていることを確認してください
  2. プロパティセッターで、呼び出しますRefreshMachineNo.RaiseCanExecuteChanged()

RaiseCanExecuteChanged は、DelegateCommand および RelayCommand にある標準メソッドです。コマンドに業界標準の ICommand 実装の 1 つを使用していることを願っています。

于 2013-11-05T16:25:31.893 に答える
0

私の問題は私のRefreshMachineNumberCommand.vbクラスにありました。

具体的には、CanExecuteChanged イベントが CommandManager を処理しませんでした。これを修正するために私がしたことは次のとおりです。

Public Custom Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged
    AddHandler(ByVal value As EventHandler)
        AddHandler CommandManager.RequerySuggested, value
    End AddHandler

    RemoveHandler(ByVal value As EventHandler)
        RemoveHandler CommandManager.RequerySuggested, value
    End RemoveHandler

    RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
        CanExecute(sender)
    End RaiseEvent
End Event

詳細については、この投稿が大いに役立ちました。

于 2013-11-05T16:29:33.423 に答える