0

さて、私はしばらく頭を悩ませてきました。しかし、私の問題の解決策を見つけることができませんでした。私が持っているのは、ObservableCollection TabItems を備えた MainViewModel です。MainViewModel は、TabControl をホストする MainView (ユーザー コントロール) の DataContext として設定されます。タブコントロールは TabItems コレクションにバインドされています。タブ コントロールのコンテンツは、ReportItems ユーザー コントロールになります。

このセットアップは、基本的に SSRS のレポート UI のレポート用です。最初のタブには、ユーザーがレポート パラメータを選択する場所からいくつかのリスト ボックスを表示する、選択するレポートのリストが含まれています。パラメータを選択した後ではなく、ユーザーがボタンをクリックすると、レポートが生成され、レポート ホストを含​​むタブ コントロールにタブが追加されます。

メイン ビューではなくタブからレポートを選択しようとしている理由は、選択するパラメーターが多数あり、リストボックスを MainView に追加すると、タブコントロール用に残されたスペースが少なくなり、ユーザーレポートを表示するには、下にスクロールする必要があります。

私の設計に欠陥があるかどうかはわかりませんが、新しい ReportItemViewModel を追加して TabItem コレクションに追加する方法を見つけたかったのです。これは、ReportItemViewModel オブジェクトを MainViewModel に送信してコレクションに追加することで、子タブが兄弟を追加できるようにすることを意味します。

そのために静的コレクションを使用することを考えましたが、それは私の OnPropertyChange メソッドを呼び出しません。また、コレクションが静的ではないため、コレクションにオブジェクトを追加できないため、MainViewModel に静的メソッドを使用しても役に立ちません。

開始方法に行き詰まっているため、ここにコードを投稿していません。ここで別の投稿を見ましたが、使用方法がわかりませんでした。

長い説明で申し訳ありませんが、質問を明確にしたかっただけです。

より良いデザインを手に入れることができれば、どんな提案も歓迎します。私は必死で、助けていただければ幸いです。

4

1 に答える 1

3

に新しいアイテムを追加するICommandためにを追加し、バインディングを使用して、内からコマンドを検索します。MainViewModelObservableCollectionRelativeSourceTabItem

したがって、MainViewModelには

ObservableCollection<IViewModel> TabItems
IViewModel SelectedTabItem
ICommand AddTabCommand

AddTabCommand基本的にどこに

void AddTab(IViewModel newItem)
{
    TabItems.Add(newItem);
    SelectedTabItem = newItem;
}

そしてあなたのUIはこれに沿って何かを見るでしょう

<DataTemplate DataType="{x:Type local:SelectReportViewModel}">
    <Grid>
        ...
        <!-- Use the CommandParameter property to pass specified ReportItemViewModel to open -->
        <Button Command="{Binding DataContext.AddTabCommand, 
                RelativeSource={RelativeSource AncestorType={x:Type TabControl}}}" />
        ...
    </Grid>
</DataTemplate>

<TabControl ItemsSource="{Binding TabItems}" />

Messengerもう1つの方法は、MVVMLightやMicrosoftPrismなどのある種のイベントシステムを使用して、イベントEventAggregatorをブロードキャスト/サブスクライブすることです。

あなたMainViewModelはサブスクライブしAddTabEventsますSelectReportViewModelが、新しいタブを追加する必要があるときはいつでもそれらのイベントをブロードキャストします。興味があれば、ViewModels間の通信に関するブログ記事に簡単な要約があります。

于 2012-04-12T14:10:34.627 に答える