2012-12-22 1 views
1

저는 MVVM 및 MVVM에 매우 익숙하며 vb.net 배경에서 왔습니다. 나는 학습을위한 몇 가지 간단한 프로젝트를 만들었고 버튼 하나가 명령을 호출하지 않고있다. 다음과 같이 내가 (가독성을 위해 단축)보기 XAML이 있습니다MVVM Light in vb.net 명령 매개 변수가있는 버튼

<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 

의 뷰 모델 클래스의 코드 제공된 값을 기반으로 배열에 제공된 값을 제외한 모든 항목을 포함합니다. 그런 다음 배열 값을 페이지의 단추에 지정합니다. 모든 것은 버튼 콘텐트 바인딩과 관련하여 작동하지만, 어떤 이유로 명령이 실행되지 않습니다.

내가이

요르단 왕에게 사전에이 뷰 모델에

답변

0

I를

덕분에 작동하지 않는 이유를 알고 도움이 필요, 나는 다른보기 모델이 정확한 방법을 사용하고 그것을 작동 명령 개체를 정의한 방식대로 변경되었습니다.

프로젝트를 다시 작업했지만 더 이상 위의 코드는 사용하지 않지만 다음은 vb에서 lambdas를 사용하여 addressof가 클래스의 공용 Sub/Functions를 참조하는 명령 개체를 정의하는 몇 가지 예입니다.

"Of String"은 addressof로 명명 된 함수에 string 유형의 명령 매개 변수를받습니다. 두 번째 주소는 부울을 반환하는 함수이며 명령의 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) 

, 정말 이해 걸 렸어요