【问题标题】:Simple MVVM with InotifyPropertyChanged at different levels在不同级别具有 InotifyPropertyChanged 的​​简单 MVVM
【发布时间】:2012-12-17 20:10:28
【问题描述】:

我是 MVVM 等深度编码的新手,在页面 MSDN Simple MVVM page 上,模型类的定义没有 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 相比,INotifyPropertyChanged 的​​效果是否与在类 customer 中的每个属性上实现的 INotifypropertychanged 相同。

  2. 在第二种情况下,当客户对象仅修改一个属性值时,例如 CurrentCustomer.FullName="asdasd" 是否会引发每个属性的 Inotifypropertychanged 事件?

  3. Viewmodelclass 能否像 datacontract 一样通过 WCF 发送,或者 datacontract 仅适用于没有 InotifyPropertyChanged 的​​ Modelclass

谢谢。

【问题讨论】:

    标签: .net vb.net wcf mvvm


    【解决方案1】:

    我会尽力回答你的问题:

    1. 在您的类/视图模型上实现 INotifyPropertyChanged。您要发送通知的所有属性都必须调用 OnPropertyChanged("YourPropertyName");

    2. 不,只有更改的属性才会生效,前提是它调用 OnPropertyChanged("YourPropertyName");

    3. 您可以发送带有 [DataContract] 属性的视图模型,但您确实应该对您的模型执行此操作。

    【讨论】:

    • 谢谢你的回复,从你的第二点,我可以认为模型类也必须实现INotifyPropertyChanged接口吗?
    • 不,它没有。通常视图模型实现 INotifyPropertyChanged 因为它是绑定到视图的类。这是视图的 DataContext。
    • 感谢您抽出宝贵时间分享知识。
    猜你喜欢
    • 2016-12-19
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多