1

我的用户控件上有一个按钮

<Button Grid.Row="13" Grid.Column="7" Content="Save" Name="btnSave" 
            CommandParameter="{Binding CompanyDetails}"
            Command="{Binding SaveCommand}" />

SaveCommand 是在 ViewModel 中声明的 RelayCommand。CompanyDetails 是同一 ViewModel 中的一个属性。上面提到的ViewModel就是我的UserControl的datacontext。

    Public Class CompanyViewModel
    Inherits ViewModelBase
    Implements IDataErrorInfo

    Private _myData As DataFromDatabase      
    Private _companyDetails As New CompanyDetailsBase
    Private _saveCommand As RelayCommandWithParameter

    Public Property CompanyDetails() As CompanyDetailsBase
        Get
            Return _companyDetails
        End Get
        Set(ByVal value As CompanyDetailsBase)
            _companyDetails = value
            OnPropertyChanged("CompanyDetails")
        End Set
    End Property

    Public Property SaveCommand() As RelayCommandWithParameter
        Get
            If _saveCommand Is Nothing Then
                Dim saveAction As New Action(Of Object)(AddressOf Me.SaveIt)
                _saveCommand = New RelayCommandWithParameter(saveAction) ', Me.CanSave)
            End If
            Return _saveCommand
        End Get

        Set(ByVal value As RelayCommandWithParameter)
            _saveCommand = value
        End Set
    End Property

    Public Sub New()
        _myData = New DataFromDatabase(My.Settings.ConnectionString)
        _saveCommand = New RelayCommandWithParameter(New Action(Of Object)(AddressOf SaveIt))
    End Sub

    Public Function GetCompanyDetails(ByVal sap As String) As CompanyDetailsBase
        CompanyDetails = _myData.GetCompanyDetails(sap)
        Return CompanyDetails
    End Function

    Public Sub SaveIt(ByVal c As CompanyDetailsBase)
        MessageBox.Show("Save customer " & c.Sap)
    End Sub

    End Class

用户控件上的其他字段绑定到调用 GetCompanyDetails 函数的 ObjectDataProvider。每次调用此函数时都会正确设置 CompanyDetails,直到我调用 SaveIt 子例程。调用 SaveIt 时,它的参数始终为 Nothing。我在哪里犯错?非常感谢您的回答。

4

2 回答 2

0

在 CompanyViewModel 的构造函数中,使用GetCompanyDetails函数填充CompanyDetails 。如下更改构造函数,

Public Sub New()
    _myData = New DataFromDatabase(My.Settings.ConnectionString)
    _saveCommand = New RelayCommandWithParameter(New Action(Of Object)(AddressOf SaveIt))
    _companyDetails = GetCompanyDetails()  
End Sub

这可能会有所帮助。祝你好运。

于 2012-04-03T09:44:35.000 回答
0

自从我做VB以来已经有一段时间了,我从来没有用WPF做过,但我想我知道你的问题是什么。

您初始化命令的方式,实际上并没有传递参数。

当我在 c# 中执行此操作时,它看起来像这样 =>

_saveCommand = new RelayCommandWithParameter(
            (param) =>
            {
                SaveIt((int)param);
            },
               // this line is the same as your commented out Me.CanSave
            (param) => { return this.CanDisplaySelectedPolicy; }); 

所以您可以看到,在 lamda 表达式中,我传递了一个名为 param 的参数,然后将其放入 SaveIt 方法中。

当你创建你的新动作时,试着像上面那样在其中放入一个 lamda 表达式,这样你就可以将一个参数传递给 SaveIt 方法。

于 2012-04-03T10:57:25.913 回答