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のデータコンテキストです。

    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のコンストラクターで、CompanyDetailsにGetCompanyDetails 関数を設定します。コンストラクタを次のように変更します。

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; }); 

ラムダ式で param というパラメーターを渡し、それが SaveIt メソッドに入れられていることがわかります。

新しいアクションを作成するときは、上記のようにラムダ式を入れてみてください。これにより、パラメーターを SaveIt メソッドに渡すことができます。

于 2012-04-03T10:57:25.913 に答える