1

私はMVVMのような深いコーディングに慣れていません.MSDN Simple MVVMページで、ModelクラスはINotifyPropertyChangedなしで定義され、VIEWModelBaseのみが使用されます。

メインコードは次のとおりです(コードは上記のページからコピーされます):

Namespace SimpleMVVM.Model

    Public Class Customer
        Public Property CustomerID() As Integer 
        Public Property FullName() As String 
        Public Property Phone() As String 
    End Class 
End Namespace

Namespace SimpleMVVM.Model
    Public Class CustomerRepository
        Private _customers As List(Of Customer)

        Public Sub New()
            _customers = New List(Of Customer) From
            {
                New Customer() With {.CustomerID = 1, .FullName = "Dana Birkby", .Phone = "394-555-0181"},
                New Customer() With {.CustomerID = 2, .FullName = "Adriana Giorgi", .Phone = "117-555-0119"},
                New Customer() With {.CustomerID = 3, .FullName = "Wei Yu", .Phone = "798-555-0118"}
            }
        End Sub 

        Public Function GetCustomers() As List(Of Customer)
            Return _customers
        End Function 

        Public Sub UpdateCustomer(SelectedCustomer As Customer)
            Dim customerToChange = _customers.Single(Function(c) c.CustomerID = SelectedCustomer.CustomerID)
            customerToChange = SelectedCustomer
        End Sub 
    End Class 
End Namespace


Imports System.ComponentModel

Namespace SimpleMVVM.ViewModel

    Public MustInherit Class ViewModelBase
        Implements INotifyPropertyChanged

        Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

        Protected Overridable Sub OnPropertyChanged(propname As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propname))
        End Sub 
    End Class 
End Namespace

Imports System.Collections.Generic
Imports SimpleMVVM.Model

Namespace SimpleMVVM.ViewModel

    Public Class CustomerViewModel
        Inherits ViewModelBase

        Private _customers As List(Of Customer)
        Private _currentCustomer As Customer
        Private _repository As CustomerRepository
        Private _updateCustomerCommand As RelayCommand

        Public Sub New()
            _repository = New CustomerRepository()
            _customers = _repository.GetCustomers()

            WireCommands()
        End Sub 

        Private Sub WireCommands()
            UpdateCustomerCommand = New RelayCommand(AddressOf UpdateCustomer)
        End Sub 

        Public Property UpdateCustomerCommand() As RelayCommand
            Get 
                Return _updateCustomerCommand
            End Get 
            Private Set(value As RelayCommand)
                _updateCustomerCommand = value
            End Set 
        End Property 

        Public Property Customers() As List(Of Customer)
            Get 
                Return _customers
            End Get 
            Set(value As List(Of Customer))
                _customers = value
            End Set 
        End Property 

        Public Property CurrentCustomer() As Customer
            Get 
                Return _currentCustomer
            End Get 
            Set(value As Customer)
                If _currentCustomer.Equals(value) Then
                    _currentCustomer = value
                    OnPropertyChanged("CurrentCustomer")
                    UpdateCustomerCommand.IsEnabled = True 
                End If 
            End Set 
        End Property 

        Public Sub UpdateCustomer()
            _repository.UpdateCustomer(CurrentCustomer)
        End Sub 
    End Class 
End Namespace
  1. 私の質問は、viewmodelbase の CustomerOBject に実装された INotifyproperty と比較して、クラス customer 内の各プロパティに実装されている INotifypropertychanged の INotifyPropertyChanged 効果の効果は同じですか。

  2. CurrentCustomer.FullName="asdasd" のように顧客オブジェクトが 1 つのプロパティ値のみ変更される 2 番目のケースでは、プロパティごとに Inotifypropertychanged イベントが発生しますか?

  3. Viewmodelclass は datacontract のように WCF 経由で送信できますか、または datacontract は InotifyPropertyChanged を使用しない Modelclass のみです

ありがとうございました。

4

1 に答える 1

2

私はあなたの質問に答えようとします:

  1. クラス/ビュー モデルに INotifyPropertyChanged を実装します。通知を送信するすべてのプロパティは、OnPropertyChanged("YourPropertyName"); を呼び出す必要があります。

  2. いいえ、OnPropertyChanged("YourPropertyName"); を呼び出す場合、変更されたプロパティのみが影響を受けます。

  3. [DataContract] に属性が付けられていればビューモデルを送信できますが、実際にはモデルでそれを行う必要があります。

于 2012-12-17T20:17:56.527 に答える