2013-08-27 7 views
0

모든 응용 프로그램에서 기본으로 사용하려는 자체 정의 된 프레임 워크에 BaseWindowViewBaseViewModel을 만들었습니다.응용 프로그램에서 프레임 워크의보기를 사용하려면 어떻게해야합니까? (WPF MVVM)

BaseViewModel에는 예를 들어 버튼을 추가 할 수있는 방법이 있습니다. Command, ButtonImageLabelString을 정의 할 수 있습니다.

<ItemsControl x:Name="CButtons" ItemsSource="{Binding Buttons}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel x:Name="ButtonStackPanel" Orientation="Horizontal"> 
      </StackPanel> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <ribbon:RibbonButton 
       x:Uid="Button" 
       LargeImageSource="{Binding Path=ImageString}" 
       Label="{Binding Path=LabelString}" 
       Command="{Binding Path=ButtonCommand}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

내가 가진 내 BaseWindowView에서

AddButton(OpenAnyTabCommand, "../Images/image.png", "LabelString"); 

나는 내가 BaseViewModel에서 정의한 RibbonButtons 모두 표시됩니다 RibbonMenue이 다음은 샘플이 메소드의 호출 코드는 이 샘플 프로젝트에서, 그리고 그것은 잘 작동합니다. 이제 BaseWindowViewBaseViewModel을 프레임 워크에 아웃소싱하여 거기에서 사용하고 싶습니다.

나의 계획은 : 내 모든 응용 프로그램에서 BaseWindowView을 내 응용 프로그램의 MainWindow으로 설정하고 싶습니다. 이 응용 프로그램 자체에서 나는 단지 UserControls을 내 BaseWindowView에 탭으로 표시해야합니다. BaseViewModel에 정의한 버튼은 새 탭을 열고 정의 된 Command을 호출해야하며이 Command 뒤에 ViewModel을 표시합니다.

내 문제를 해결하는 가장 좋은 방법은 무엇입니까? XAML에는 "고전적인 상속"이 없다는 것을 알고 있습니다. 프레임 워크 뷰에 App.xaml에있는 StartUpUri을 정의하거나 "약간"더 까다로운 작업을 수행 할 수 있습니까? 부가로

는 :

<DataTemplate DataType="{x:Type ViewModel:AnyViewModel}"> 
    <view:TabItemAny/> 
</DataTemplate> 

@Sheridan을 : 다음은 BaseWindowView에 대한 질문은 나는 다음과 같은 App.xaml에 (UserControls 있습니다)에 TabItems에 대한 DataTemplate을 정의 할 수 있음을 발견했다. 좋아

+0

질문은 매우 명확하지 않다 : 문제는 무엇인가? 그리고 XAML 상속과 같은 것이 없다는 것을 알고 있습니까? –

+0

예, "고전적인 상속"이 없음을 알고 있습니다. 내 질문은 어떻게 내가보기의 상속과 같은 일을 할 수 있습니다. 내 'Framework-View'를 내 응용 프로그램의 MainWindow로 표시하고이 윈도우에서 Tab을 여는 데 필요한 UserControls를 추가하고 싶습니다. – Tobias

+0

@Sheridan, 여기에 질문이 있습니다 – Tobias

답변

1

, 그래서 BaseWindowViewMainWindow로 사용하여 해결하자, 시작하기 :

첫째, App.xaml 파일에서 Application 정의에서 StartupStartupUri 속성의 선언을 제거합니다. 이 대신 MainWindow 당신의 Window 열립니다

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 
    BaseWindowView baseWindowView = new BaseWindowView(); 
    baseWindowView.Show(); 
} 

: 그런 다음 App.xaml.cs 클래스에서, 시작 처리기를 추가합니다.

보기 상속에 ... 아시는 바와 같이 WPF에는 그런 것이 없지만이 문제를 해결하는 방법이 있습니다. 귀하의 의견이 모두 UserControl을 기반으로하는 경우 관련 DataTemplate 개체가 존재하는 경우 ContentControl 개체를 사용하여 표시 할 수 있습니다.

이것은 기본적으로 특정 Window을보기의 외부 서식 파일로 사용하려는 경우 ContentControl을 추가하여보기를 표시 할 수 있음을 의미합니다.예를 들어, 여러 개의 다른 UserControl을 바인딩하는 버튼이있는 대화 상자 컨트롤로 표시되는 애니메이션이 Window이므로 전체 모양이 모두 동일합니다.

XAML에서

:

... 
<Border CornerRadius="3.5" BorderBrush="{StaticResource TransparentBlack}" 
    BorderThickness="1" Padding="1"> 
    <ContentControl Content="{Binding ViewModel, RelativeSource={RelativeSource 
     FindAncestor, AncestorType={x:Type Controls:AnimationWindow}}}" /> 
</Border> 
... 

그리고 뒤에 Window 코드 :

public static readonly DependencyProperty ViewModelProperty = DependencyProperty. 
    Register("ViewModel", typeof(BaseViewModel), typeof(AnimationWindow)); 

public BaseViewModel ViewModel 
{ 
    get { return (BaseViewModel)GetValue(ViewModelProperty); } 
    set { SetValue(ViewModelProperty, value); } 
} 

이 클래스를 사용하여, 나는이 XAML에서이 ViewModel 속성에 바인딩 중 하나가, 또는 전달되는 값에서 설정할 수 있습니다 에서 생성자를 통해. 내 모든 뷰 모델이이 BaseViewModel 클래스를 확장하므로이 속성을 모든 클래스에 설정할 수 있습니다.

UPDATE >>> 뷰/뷰 모델을 연결하는 ContentControlDataTemplate의 사용의

요점은 우리가 멀리 '하드 코딩'에서 얻을 수 있다는 것입니다. 모든 응용 프로그램에서이 설정을 사용할 수 있으며 특정 구현을 사용하는 경우 이 아닌이 사용됩니다. 당신은 당신이 실제로, 당신은 별도의 Resources의 뷰/뷰 모델을 연결하도록 DataTemplate의를 두어야하여 다른 모든 응용 프로그램에 같은 뷰/뷰 모델 페어링을 사용하도록 말을하는 경우 이제

xaml 파일. 당신이 필요로하는 곳에 그런 식으로, 당신은 응용 프로그램에 App.xamlResources 섹션으로이 파일을 병합 할 수 있습니다 당신은하지하지 않을 때 :

<Application.Resources> 
    <ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="ViewModelToViewDataTemplates.xaml"/> 
     <ResourceDictionary> 
      <!-- Add your normal resources here --> 
     </ResourceDictionary> 
    </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 
+0

답변 해 주셔서 감사합니다! Startup-Handler를 추가하면 정상적으로 작동합니다. 'BaseViewWindow'에 UserControl (ComboBox 여야 함)의 호출을 추가 할 수 있지만 UserControl 자체가 내 응용 프로그램에 정의되어 있는지 알 수 있습니까? 또한 UserControl의 DataContext는 내 응용 프로그램에서'ViewModel'이어야합니다. – Tobias

+0

안녕하세요. 'BaseContWindow'에'UserControl' ('ComboBox'가 있어야합니다)의 호출을 추가 할 수 있는지 알고 있습니까? – Sheridan

+0

내 BaseViewWindow에서'을 사용하고 싶습니다. 그러나 UserControl 자체와 PersonViewModel은 프레임 워크가 아니라 응용 프로그램에 있습니다. – Tobias

관련 문제