0

私はWPFが初めてです。ユーザーが大量のデータを入力する必要があり、フォームの一部が繰り返される機能(初期化と呼びます)を持つアプリケーションを構築しようとしています。次/前のページではなく、1 つのウィンドウで折りたたみ可能なパネルを使用する可能性がありますが、非常に長いウィザードを持つレガシー アプリを書き直しています。また、いくつかの部分が繰り返されます。たとえば、ユーザーはアイテムの数を指定できます。ユーザーが 3 と言う場合、それぞれの構成情報を入力する必要があるため、これらのコントロールを 3 回繰り返す必要があります。

私は MVVM を使用しており、ここでこの例を使用しています: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

古いウィザードは約 4 ページだったので、xaml を少し分割するために 4 つの子ユーザー コントロールを含むユーザー コントロール (初期化) を 1 つ持つつもりです。

これまでのところ、初期化があり (その ViewModel は上記の例のように Workspace ViewModel から継承されます)、動作している 1 つの子が含まれています。

<Expander ExpandDirection="Down" Header="ChildOne">
<view:ChildOne />
</Expander>

各子と初期化用に個別の ViewModel を用意することで、問題が発生します。私が抱えている問題は、ChildOne に次のようにバインドしようとしているドロップダウンが含まれていることです。

<ComboBox x:Name="textMessageTypeCmb" ItemsSource="{Binding Path=TextMessageSelectionOptions, Mode=OneTime}"/>

TextMessageSelectionOptions は、ChildOne の ViewModel のパブリック プロパティです。これにより、エラーは発生しませんが、空のドロップダウンが発生します。そのプロパティ ゲッターは呼び出されません。そのプロパティ ゲッター コードを Initialisation の ViewModel に移動すると、代わりに機能しますが、コードを扱いやすいチャンクに保持しようとしているので、ハット コードを ChildOne の ViewModel に戻したいと考えています。MainWindow で、このように Initialization の代わりに ChildOne をワークスペースとして作成した場合にも機能します

ChildOneViewModel ws = this.Workspaces.FirstOrDefault(vm => vm is ChildOneViewModel) as ChildOneViewModel;

私が正しいアプローチを取っているかどうか (いくつかのユーザー コントロールに分割することによって) と、これを機能させるためにバインディングで何をする必要があるかについて、だれかがアドバイスできますか? 私はこれについてまだ何も理解していませんが、特に拘束力があります。

4

1 に答える 1

1

あなたの ChildOne ビューDataContextはまだこの初期化 vm のようです。

Datacontextビューを ChildOneViewModel オブジェクトにバインドできます

...
<view:ChildOne DataContext={Binding PropertyReturnsChildOneViewModellObject/>
...

または、コンボボックスの ItemsSource プロパティのパスを指定します。

<ComboBox x:Name="textMessageTypeCmb" ItemsSource="{Binding Path=PropertyReturnsChildOneViewModellObject.TextMessageSelectionOptions, Mode=OneTime}"/>

注: PropertyReturnsChildOneViewModelObject は、初期化 vm のプロパティです。

于 2012-04-04T11:34:04.643 に答える