2012-04-12 7 views
0

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

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

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

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

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

私はそれ自身を始める方法に固執して以来、私はここにコードを掲載していません。私は別の投稿hereを見ましたが、それを使う方法を理解できませんでした。

ご迷惑をかけて申し訳ございませんが、質問を明確にしたいと思います。

私はより良いデザインを得ることができる場合でも、私は任意の提案に開放されています。私は絶望的であり、どんな助けも認められるだろう。

+0

ポップアップまたはエキスパンダーを使用して、追加プロセスのUIをホストすることができます。あなたは画面の不動産を使用せず、ReportItemViewModelではロジックを追加しないでください。 – AlexDrenea

+0

ポップアップは私が考えていたものでしたが、外見が崩れているように感じました。エキスパンダーについて、私は複数のレポートを持っているので、実装方法はよくわかりません。レポートごとに1つのエクスパンダが無効/不可視モードにあり、レポートの選択に基づいて有効/表示可能にする必要があることを意味しますか。あなたは精緻化できますか? –

+0

画面の不動産を保存したいので、メインビューではなくタブにリストがあると言っています。私は、メインビューでエキスパンダーを使用すると、折りたたまれたときにレポートのための十分なスペースが得られ、拡張されたときに新しいレポートを追加するのに十分なスペースがあると言っていました。 – AlexDrenea

答えて

3

だからあなたMainViewModelが

ObservableCollection<IViewModel> TabItems 
IViewModel SelectedTabItem 
ICommand AddTabCommand 

AddTabCommandを持っているでしょう、あなたのObservableCollectionに新しい項目を追加するためにあなたのMainViewModelICommandを追加し、TabItem

内からコマンドを見つけるために、結合RelativeSourceを使用基本的には

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}" /> 

別の代替の線に沿って何かを見てしまう/イベントにサブスクライブブロードキャストするために、MVVMライトのMessengerまたはMicrosoftプリズムのEventAggregatorとして、イベントシステムのいくつかの種類を使用することです。

MainViewModelAddTabEventsに登録し、SelectReportViewModelは新しいタブを追加する必要があるたびにこれらのイベントをブロードキャストします。あなたが興味を持っているのなら、私のブログ記事の概略はcommunication between ViewModelsです。

+0

これは有望そうです。私は実際にこのようなものを探していましたが、WPFには比較的新しいので、聞いたことはありませんでした。あるVMから別のVMへの通信方法について考えたことはありませんでした。実装され、どのようにそれが起こっているか教えてください。 –

+0

素晴らしい...それは働いた...私はイベントアグリゲータのパターンを使用した...魅力的なように働いた...多くのありがとう... :) –

関連する問題