2017-10-15 17 views
3

저는 C# -WPF-App에서 일하고 있습니다.UI 컨트롤에 바인딩하는 대신 C# 코드에서 Command를 호출하는 방법은 무엇입니까?

창에서 특정 버튼을 누르면 모듈이로드됩니다. 버튼의 명령 속성이 클래스 "ConfigureViewModel"의 LoadModuleCommand에 바인딩되어 있기 때문에이 문제가 발생 : 어떤 이유

<Button Command="{Binding LoadModuleCommand}" Margin="10,10,10,10" Grid.Column="1" Content="Add Module" Grid.Row="0" /> 

,이 질문에 대한 중요하지 않다, 나는 이제 (동일한 명령을 호출 할 특정 조건에 해당하는 경우 MainViewModel.cs 파일에서 즉 LoadModuleCommand) : 내가 두 번째 UI 제어에 LoadModuleCommand을 결합해야한다면 내가해야 할 일을했을 것을 알고

if (id.Equals(Module.Id.ToString())) 
     { 
      //call the LoadModuleCommand 

     } 

. 하지만 어떻게하면 C# -code 내에서 간단히 명령을 호출 할 수 있습니까?

+1

명령을 다른 클래스에 추상화하여 어디서나 재사용 할 수있는 이유는 무엇입니까? – Crowcoder

+0

LoadModuleCommand는 일부 함수 xyz()를 호출합니다.이 함수 (예 : xyz() - 함수)를 public 및 static으로 만든 다음 if-block 내부에서 호출하려고했습니다. 오류 메시지가 아니었지만 모듈이로드되지 않았습니다 ... 왜 작동하지 않는지 잘 모르겠습니다. –

답변

1

문제를 해결하는 방법에는 여러 가지가 있습니다.

한 가지 방법은 바인딩 된 데이터 컨텍스트를 가져 와서 캐스팅하는 것입니다. 이제 다음과 같은 명령을 실행할 수 있습니다.

var viewModel = (ConfigureViewModel)DataContext; 
if (viewModel.LoadModuleCommand.CanExecute(null)) 
{ 
    viewModel.LoadModuleCommand.Execute(null); 
} 

올바르게 캐스팅하려면 데이터 컨텍스트의 유형을 알아야합니다. 가능한 여러 가지 유형이있는 경우 인터페이스를 사용하십시오.

두 번째 방법은 버튼 (예를 들어, <Button x:Name="loadModuleButton" .../>)에 이름을 지정하고이 ConfigureViewModel에서와 MainViewModel 호출 된) 당신은 함수 XYZ를 (있다고 말했다

loadModuleButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent)); 
2

처럼 클릭 된 이벤트를 발생하는 것입니다. 이 함수는 모든 뷰 모델의 생성자에서 초기화 할 수있는 또 다른 클래스이거나 종속성 삽입을 통해 생성자에서 매개 변수로 보내야합니다. ConfigureViewModel에 대한 명령과 MainViewModel에 대한 명령을 무시하고 점검해야합니다.