RelayCommand commandParameter является нулевым - PullRequest
1 голос
/ 03 апреля 2012

У меня есть кнопка на моем пользовательском контроле

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

SaveCommand - это RelayCommand, объявленный во ViewModel.CompanyDetails - это свойство в той же модели представления.Упомянутый выше ViewModel является текстовым контентом моего UserControl.

    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

Другие поля в usercontrol связаны с ObjectDataProvider, который вызывает функцию GetCompanyDetails.CompanyDetails устанавливается правильно каждый раз, когда вызывается эта функция, пока я не вызову подпрограмму SaveIt.Когда SaveIt вызывается, его параметр всегда NothingГде я могу ошибиться?Большое спасибо за ответы.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2012

Прошло много времени с тех пор, как я сделал 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.

0 голосов
/ 03 апреля 2012

В конструкторе CompanyViewModel заполните CompanyDetails с помощью функции GetCompanyDetails .Измените конструктор, как показано ниже:

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

Это может помочь.Удачи.

...