1

私は MVVM と MVVM light を初めて使用し、vb.net のバックグラウンドを持っています。学習用の簡単なプロジェクトをいくつか作成できましたが、あるビューではボタンがコマンドを呼び出していません。次のようなビュー xaml があります (読みやすくするために短縮されています)。

<UserControl x:Class="FTC.View.NavigationView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
         xmlns:vm="clr-namespace:FTC_Application.FTC.ViewModel"
         mc:Ignorable="d" 
         d:DesignWidth="900"
         Height="161"
         DataContext="{Binding NavigationView, Source={StaticResource Locator}}" >

<UserControl.Resources>
    <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</UserControl.Resources>

<Grid>
        <Button HorizontalAlignment="Left" Margin="10" VerticalAlignment="Top"   
                 Command="{Binding SwapParent}"
                CommandParameter="{Binding Parent1}" Background="{x:Null}" BorderBrush="{x:Null}" Width="130" Height="45">
            <TextBlock Text="{Binding Parent1}" Foreground="#FFE4E4E4"/>
        </Button>

以下は、ボタン機能のビューモデル クラスのコードです。

Private _sNavs() As String = {"Dashboard", "Jobs", "People", "Products", "Financials", "Admin"}
Private _sParentNavs() As String
Public Property SwapParent As RelayCommand
Private Property ParentNavs() As String()
        Get
            Return _sParentNavs
        End Get

        Set(value As String())
            If _CurrentParent = String.Empty Then
                _CurrentParent = "Dashboard"
            Else
                If _sParentNavs.Contains(_CurrentParent) = False Then
                    Return
                End If
            End If

            RefreshParents(_CurrentParent)
            RaisePropertyChanged(ParentNavsPropertyName)

        End Set
    End Property

Public Sub New()

        If _CurrentParent = String.Empty Then
            _CurrentParent = "Dashboard"
        End If
        RefreshParents(_CurrentParent)
        SwapParent = New RelayCommand(Sub()
                                          ParentNavs = _sParentNavs
                                      End Sub)

    End Sub

Private Sub RefreshParents(sCurrent)

        If _sNavs.Contains(sCurrent) = True Then
            _sParentNavs = Filter(_sNavs, sCurrent, False, CompareMethod.Text)
        Else
            _sParentNavs = Filter(_sNavs, "Dashboard", False, CompareMethod.Text)
        End If

        Parent1 = _sParentNavs(0)
        Parent2 = _sParentNavs(1)
        Parent3 = _sParentNavs(2)
        Parent4 = _sParentNavs(3)
        Parent5 = _sParentNavs(4)

    End Sub

したがって、このコードは、指定された値に基づいて親配列を変更し、指定された値以外のすべての項目を含めることを意図しています。次に、ページ上のボタンに配列値を割り当てます。ボタンのコンテンツ バインディングに関してはすべて機能しますが、何らかの理由でコマンドが実行されません。別のビューモデルでこの正確な方法を使用しましたが、機能します。

これがこのビューモデルで機能しない理由を知るために、助けが必要です

前もって感謝します

ヨルダン王

4

1 に答える 1

0

コマンドオブジェクトを定義する方法を変更しました。

私は自分のプロジェクトを作り直し、上記のコードを使用しなくなりましたが、次の例は、vb でラムダを使用して、addressof がクラス内のパブリック サブ/関数を参照するコマンド オブジェクトを定義する例です。

「Of String」は、addressof で指定された関数へのタイプ string のコマンド パラメータを受け取ります。の 2 番目のアドレスは、コマンドの canexecute メソッドに対して評価されるブール値を返す関数です。

NavigateShellCommand = New RelayCommand(Of String)(AddressOf NavigateShell)
NavigateChildCommand = New RelayCommand(Of String)(AddressOf NavigateChild)
IsParentEnabled = New RelayCommand(Of String)(AddressOf NavigateChild, AddressOf ParentEnabled)
IsChildEnabled = New RelayCommand(Of String)(AddressOf NavigateChild, AddressOf ChildEnabled)

これが誰かの助けになることを願っています。本当に理解するのに時間がかかりました

于 2013-01-08T07:30:56.173 に答える