属性已更新为初始值,没有任何更改

时间:2015-11-03 20:00:08

标签: .net vb.net winforms telerik bindingsource

在第一次更改ViewModel.ReceiveWarehouseID后,无法找到查看更新ViewModel.Quantity的原因? 当表单打开值正常时。如果RadSpinEditorQuantity的值已更改,则RadDropDownListWarehouses的SelectedValue将更改为0 如果RadDropDownListWarehouses的SelectedValue先改变了 - 那么一切都正常。

之前我使用过与ViewModels和RadDropDownList控件相同的方法,从未注意到这种行为

这里是Form和ViewModel的完整代码 - 完整,因为我没有找到任何可以更改ReceiveWarehouseID值的代码。

查看(RadForm)

Public Sub New(viewmodel As Object)
    Me.InitializeComponent()

    Me.BindingSourceViewModel.DataSource = viewmodel
    Me.InitializeDataBindings()
End Sub

Private Sub InitializeDataBindings()
    Me.RadLabelDescription.DataBindings.Add("Text", 
                                            Me.BindingSourceViewModel, 
                                            "ItemDescription", 
                                            True, 
                                            DataSourceUpdateMode.Never)

    With Me.RadSpinEditorQuantity.DataBindings
        .Add("Value", Me.BindingSourceViewModel, "Quantity", True)
        .Add("Minimum", Me.BindingSourceViewModel, "MinQuantity", True)
        .Add("Maximum", Me.BindingSourceViewModel, "MaxQuantity", True)
    End With

    With Me.RadDropDownListWarehouses
        .DisplayMember = "Name"
        .ValueMember = "ID"
        .FormattingEnabled = True
        .DataMember = "WarehouseList"
        .DataSource = Me.BindingSourceViewModel
        .DataBindings.Add("SelectedValue", 
                          Me.BindingSourceViewModel, 
                          "ReceiveWarehouseID", 
                          True, 
                          DataSourceUpdateMode.OnPropertyChanged)
    End With
End Sub

ViewModel(实施INotifyPropertyChanged

Public Sub New(original As OriginalRowViewModel)
    _Original = original 
    _Model = New RowTransfer() 'Here _Model.ReceiveWarehouseID set = 1
    Me.WarehouseList = Warehouse.GenerateList()
End Sub

Private _Original As OriginalRowViewModel
Private _Model As RowTransfer

Public Property Quantity As Decimal
    Get
        Return _Model.Quantity
    End Get
    Set(ByVal value As Decimal)
        If _Model.Quantity= value Then Exit Property
        _Model.Quantity= value
        Me.RaisePropertyChanged(Function() Me.Quantity)
    End Set
End Property

Public Property ReceiveWarehouseID As Integer
    Get
        Return _Model.ReceiveWarehouseID
    End Get
    Set(ByVal value As Integer)
        If _Model.ReceiveWarehouseID= value Then Exit Property
        _Model.ReceiveWarehouseID= value
        Me.RaisePropertyChanged(Function() Me.ReceiveWarehouseID)
    End Set
  End Property

  Public ReadOnly Property ItemDescription As String
     Get
        Return _Original.ItemDescription
     End Get
  End Property

  Public ReadOnly Property MaxQuantity As Decimal
     Get
        Return _Original.FreeQuantity
     End Get
  End Property

  Public ReadOnly Property MinQuantity As Decimal
     Get
        Return 1D
     End Get
  End Property

  Public Property WarehouseList As List(Of Warehouse)

更新 如果我将仓库列表直接设置为RadDropDownList而没有BindingSource

RadDropDownList.DataSource = Warehouse.GenerateList()'

或者,如果我从Me.RaisePropertyChanged(Function() Me.PropertyName)Quantity的制定者中移除ReceiveWarehouseID 然后,每个人都可以正常工作 但是没有想要这样做,因为在WPF窗口中将使用相同的ViewModel。我尝试制作适用于所有视图的ViewModel(Winforms和WPF) - 保留ViewModel中的仓库列表

Application.exe!Application.ViewModels.RowTransferViewModel.set_ReceiveWarehouseID(Integer value = 0)
[Native to Managed Transition]
[Managed to Native Transition]
System.dll!System.SecurityUtils.MethodInfoInvoke(System.Reflection.MethodInfo method, object target, object[] args)
System.dll!System.ComponentModel.ReflectPropertyDescriptor.SetValue(object component = {Application.ViewModels.RowTransferViewModel}, object value = 0)
System.Windows.Forms.dll!System.Windows.Forms.BindToObject.SetValue(object value)
System.Windows.Forms.dll!System.Windows.Forms.Binding.PullData(bool reformat, bool force)
System.Windows.Forms.dll!System.Windows.Forms.Binding.Target_PropertyChanged(object sender, System.EventArgs e)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadDropDownList.OnSelectedValueChanged(object sender, int newIndex, object oldValue, object newValue) 
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadDropDownList.element_SelectedValueChanged(object sender, Telerik.WinControls.UI.Data.ValueChangedEventArgs e)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadDropDownListElement.OnSelectedValueChanged(object sender, Telerik.WinControls.UI.Data.ValueChangedEventArgs e)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadDropDownListElement.NotifyOwner(Telerik.WinControls.UI.PopupEditorNotificationData notificationData)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.PopupEditorElement.listElement_SelectedValueChanged(object sender, System.EventArgs e)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadListElement.OnSelectedValueChanged(int newIndex)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadListElement.OnSelectedIndexChanged(int newIndex)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadListElement.HandleSelectOne(int newIndex)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadListElement.ProcessSelection(int newIndex, bool onMouseDrag, Telerik.WinControls.UI.InputType inputType, int dir)  
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.RadListElement.dataLayer_CurrentPositionChanged(object sender,     Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.ListDataLayer.OnCurrentPositionChanged(int newPosition)
Telerik.WinControls.UI.dll!Telerik.WinControls.UI.ListDataLayer.CollectionView_CurrentChanged(object sender, System.EventArgs e)
Telerik.WinControls.dll!Telerik.WinControls.Data.RadCollectionView<System.__Canon>.OnCurrentChanged(System.EventArgs args)
Telerik.WinControls.dll!Telerik.WinControls.Data.RadCollectionView<Telerik.WinControls.UI.RadListDataItem>.SetCurrentPositionCore(int newPosition, bool forceNotify, Telerik.WinControls.CurrentChangeReason reason)
Telerik.WinControls.dll!Telerik.WinControls.Data.RadListSource<System.__Canon>.currencyManager_PositionChanged(object sender, System.EventArgs e)
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.OnPositionChanged(System.EventArgs e)
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.ChangeRecordState(int newPosition, bool validating, bool endCurrentEdit, bool firePositionChange, bool pullData)
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.Position.set(int value)
System.Windows.Forms.dll!System.Windows.Forms.BindingSource.Position.set(int value)
System.Windows.Forms.dll!System.Windows.Forms.BindingSource.ParentCurrencyManager_CurrentItemChanged(object sender, System.EventArgs e)
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.OnCurrentItemChanged(System.EventArgs e)
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.List_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
System.Windows.Forms.dll!System.Windows.Forms.BindingSource.OnListChanged(System.ComponentModel.ListChangedEventArgs e)
System.Windows.Forms.dll!System.Windows.Forms.BindingSource.InnerList_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
System.dll!System.ComponentModel.BindingList<System.__Canon>.OnListChanged(System.ComponentModel.ListChangedEventArgs e)
System.dll!System.ComponentModel.BindingList<Application.ViewModels.RowTransferViewModel>.Child_PropertyChanged(object sender,     System.ComponentModel.PropertyChangedEventArgs e)
Application.exe!Application.ViewModels.ViewModelBase.RaisePropertyChanged(Of Decimal)(System.Linq.Expressions.Expression(Of System.Func(Of Decimal)) kentta = {System.Linq.Expressions.Expression(Of System.Func(Of Decimal))})

0 个答案:

没有答案