0

すべてのアプリケーションでベースとして使用したい自己定義のフレームワークで とBaseWindowViewを作成しました。BaseViewModel

BaseViewModelたとえば、ボタンを追加できるメソッドがあります。Command、 、ButtonImageおよびを定義できますLabelString。このメソッドの呼び出しのサンプル コードは次のとおりです。

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

私のBaseWindowViewには、で定義したRibbonMenueすべてのが表示されている場所があります。RibbonButtonsBaseViewModel

<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>

これはサンプル プロジェクトにあり、正常に動作します。今、私はBaseWindowViewBaseViewModelをフレームワークに外注し、そこから使用したいと考えています。

BaseWindowView私の計画は次のとおりです。各アプリケーションで、アプリケーションのとして設定したいと思いMainWindowます。このアプリケーション自体UserControlsでは、BaseWindowView. で定義したボタンは、新しいタブを開いて this の背後に表示するBaseViewModeldefined を呼び出す必要があります。CommandViewModelCommand

では、私の問題を処理する最善の方法は何ですか? XAML に「クラシック継承」がないことはわかっています。StartUpUriフレームワークビューにを定義するようなことはできますApp.xamlか、それとも「少し」トリッキーですか?

追加として、次のようにDataTemplateforTabItemsを定義できることがわかりました。UserControlsApp.xaml

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

@Sheridan: についての質問BaseWindowViewです。

4

1 に答える 1

1

では、まず、 yourBaseWindowView を として使用して対処しましょうMainWindow

最初に、ファイルで、定義からおよびプロパティApp.xamlの宣言を削除します。次に、クラスにスタートアップ ハンドラを追加します。StartupStartupUriApplicationApp.xaml.cs

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

Windowこれにより、の代わりにあなたが開きますMainWindow

さて、継承を見てみましょう...ご存知のように、WPFにはそのようなものはありませんが、この問題を回避する方法があります。あなたが言うように、すべてのビューがUserControlベースでContentControlある場合、関連するDataTemplateオブジェクトが存在する場合、オブジェクトを使用してそれらを表示できます。

Windowこれは基本的に、特定の をビューの外部テンプレートとして使用したい場合、 を追加しContentControlてビューを表示することができることを意味します。Window例として、いくつかの異なる をバインドしたボタン付きのダイアログ コントロールとして表示されるアニメーションを作成UserControlし、全体的な外観がすべて同じになるようにします。

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); }
}

このクラスを使用してViewModel、xaml でこのプロパティにバインドするか、コンストラクターを介して渡された値から設定することができます。すべてのビュー モデルがこのクラスを拡張するためBaseViewModel、このプロパティを任意のビュー モデルに設定できます。

更新 >>>

ContentControlとを使用しDataTemplateてビュー/ビュー モデルを接続するポイントは、「ハード コーディング」から逃れることです。このセットアップはすべてのアプリケーションで使用でき、特定の実装を使用することに縛られていません。

異なるすべてのアプリケーションで同じビュー/ビュー モデルの組み合わせを実際に使用したい場合はDataTemplate、ビュー/ビュー モデルを接続する を別のResourcesxaml ファイルに配置する必要があります。そうすれば、このファイルをApp.xaml Resources必要なアプリケーションのセクションにマージできますが、不要な場合はマージできません。

<Application.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="ViewModelToViewDataTemplates.xaml"/>
      <ResourceDictionary>
          <!-- Add your normal resources here -->
      </ResourceDictionary>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Application.Resources>
于 2013-08-28T10:55:49.630 に答える