2017-05-04 1 views
1

시나리오는 다음과 같습니다.셸의 단추를로드 된 모듈의 viewmodel에 정의 된 명령에 바인딩하려면 어떻게합니까?

WPF, MVVM, Prism 6.3.0에서 개발 된 응용 프로그램이 있습니다. 이 응용 프로그램은

  • Shell.xaml (쉘)
  • UserControl1.xaml (모듈 내부 independient 클래스 라이브러리) I 셸에 정의 된 버튼을 클릭하면

, 나는 기대를 고려 명령이 실행되고 CanExecute에 정의 된 조건이 확인됩니다. 그러나이 명령은 모듈의 뷰 모델 인 ViewModel 클래스에 정의됩니다 (이 응용 프로그램에서는 Prism이 전통적으로 구현하는 하나 이상의 모듈이로드됩니다).

호출 될 때까지 나는 localviewmodel을 셸의 리소스 컬렉션에 정의하려고했습니다. 이 명령을 트리거 할 수 있지만 CanExecute 조건을 트리거하지 않습니다.

모듈 안에 사용자 정의 컨트롤에 정의 된 XAML 코드를 넣으면 (즉, 콘텐츠 영역 관리자를 사용하지 않는 간단한 응용 프로그램을 코딩하면) 단일 페이지 XAML 응용 프로그램 인 경우이 명령은 CanExecute 문제없이. 내 생각 엔 모듈 viewmodel에 정의 된 명령을 셸의 단추에 바인딩하는 문제입니다. 그것에 대해 많은 것을 읽었을 때, 저는 바인딩을 선언하는 올바른 방법을 얻지 못했습니다.

여기서 예이다 :

MyRecords 데이터를 보유의 GridView의 이름이고 LocalViewModel로드 된 모듈에 정의 된 뷰 모델의 인스턴스의 열쇠
<Telerik:RadRibbonView x:Name="BarraHerramientas" Grid.Row="0" 
          DockPanel.Dock="Top" 
          ContentHeight="130" 
          Height="160" 
          Template="{DynamicResource RadRibbonViewStyle}" 
          MinimizeButtonVisibility="Visible" 
          HelpButtonVisibility="Visible" Background="Red"> 
     <Telerik:RadRibbonTab Header="1" 
           Style="{DynamicResource RadRibbonTabStyle}" 
           IsSelected="True" 
           TabIndex="0"> 
      <Telerik:RadRibbonGroup Header="RibbonGroup1" 
            DialogLauncherVisibility="Visible"> 
       <Telerik:RadRibbonButton CollapseToMedium="Never" 
             CollapseToSmall="WhenGroupIsMedium" 
             IsAutoSize="True" 
             LargeImage="Agregar.png" 
             Size="Large" 
             SmallImage="Agregar_16x16.png" 
             Text="Add..." 
             Command="{Binding AddRecordCommand, Source={StaticResource LocalViewModel}}" 
             CommandTarget="{Binding ElementName=MyRecords}" 
             CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" " 
             Telerik:ScreenTip.Description="..." /> 
      </Telerik:RadRibbonGroup> 
     </Telerik:RadRibbonTab> 
</Telerik:RadRibbonView> 

. 따라서 LocalViewModel의 시점에는 Shell.xaml의 리소스로 정의 된 인스턴스와 "MyRecords"GridView를 보유한로드 된 모듈에 정의 된 인스턴스의 두 인스턴스가 있습니다.

한 페이지짜리 예제를 사용하면 물론 완벽하게 작동합니다. 그리고 몇 개의 모듈을 작성해야하기 때문에 각 모듈은 자체 ViewModel 또는 둘 이상의 모듈을 정의합니다. 그렇기 때문에 쉘에서 다른 모듈의 뷰 모델 에 정의 된 명령을 사용해야하기 때문입니다. 셸에서 각 ViewModel을 선언하면 (많은 데이터가 제공됨) 성능 문제가 발생할 수 있습니다.

그래서 "On Demand"로로드되는 모듈에서 ViewModel에 정의 된 명령을 (셸에서) 호출 할 수 있습니까?

모두에게 감사드립니다.

답변

0

원하는 것을 성취 할 수있는 방법은 여러 가지가 있습니다. 한 가지 방법은 CompositeCommand를 사용하는 것입니다. ShellViewModel에 매개 변수로 사용하는 데이터가 항상 포함되어 있으면이 옵션이 유용합니다. 각 ViewModel는 부모 CompositeCommand를 등록 할 수있어 CompositeCommand가 불려 갈 때마다 등록 된 모든 VM 커멘드가 불려갑니다. 또 다른 방법이 될 것이다

https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/12-UsingCompositeCommands

각 당신이 쉘에 주입보기와 리본 버튼을 주입 가지고 : 현재 CompositeCommands의 샘플을 볼 수 있습니다. 따라서 각 뷰는 쉘 영역에서 뷰를 추가/제거 할 때 어떤 탭을 리본에 추가/제거해야하는지 알 수 있습니다.종속 뷰로드 : 당신은 프리즘 문제 내 인 Pluralsight 과정에서 & 솔루션을 그렇게하는 방법을 볼 수 있습니다

https://www.pluralsight.com/courses/prism-problems-solutions

+0

브라이언, 당신의 응답을 주셔서 감사합니다 ... 나는 지금 그것을 이해하는 것이 그 예를 읽고있다. 더 많은 정보를 추가하기 위해 필요한 것은, 콤보 박스 값에 따라 리본 뷰 버튼을 활성화/비활성화시키는 것으로, 모듈의 ViewModel에서 SelectedItem 속성을 보유합니다. 이는 해당 속성의 변경 사항에 반응하기 위해 리본보기 단추가 필요했기 때문에 문제는 속성이 셸이 아닌 모듈 내부의 ViewModel에 있다는 것입니다. 즉, Shell은 ViewModel의 모델을 인식하지 못합니다. 이걸 제대로보고 있습니까? 안부, 찰리. –

+0

응용 프로그램 아키텍처는 쉽게 설명하거나 SO 주석에서 해결할 수있는 것이 아닙니다. 앱 구성 방법이나 요구 사항에 대해 잘 모릅니다. 접근 방법을 배우고 시나리오에 지식을 적용하는 것이 좋습니다. –

관련 문제