1

進行中のすべてのデータビットを処理するために、背後にあるMVVMを使用するSilverlightページがあります。

データコンテキストは、以下を使用してページに設定されます。

DataContext="{Binding AddNewClientViewModel, Source={StaticResource ServiceLocator}}"

ServiceLocatorは、IoCコンテナを使用して適切なVMを作成および挿入できるようにするサービスです。

これはすべて正常に機能します。

今、私は次のようなDataFormを持っています:

        <df:DataForm CurrentItem="{Binding NewClient}" AutoGenerateFields="False"  >
        <df:DataForm.NewItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <df:DataField>
                        <TextBox Text="{Binding ClientName}" />
                    </df:DataField>
                    <df:DataField>
                        <TextBox Text="{Binding Property_on_the_VM_not_on_NewClient}" />
                    </df:DataField>
                </StackPanel>
            </DataTemplate>
        </df:DataForm.NewItemTemplate>
    </df:DataForm>

OK、このデータフォームは私のViewModelのNewClientプロパティにバインドします。最初のDataFieldはNewClient.ClientNameにバインドされます。ルートViewModelにぶら下がっているプロパティにバインドしたい2番目のDataField。

バインド時に渡すことができる「ソース」パラメーターがあることは知っています。VMなどの静的リソースがある場合は、それを指すことができますが、そうではありません。このバインディングを親VMのプロパティとリンクするにはどうすればよいですか?


編集

以下のJobiによる投稿の後、私は次のことを試しました。

<TextBox DataContext="{Binding DataContext, ElementName=root}"  Text="{Binding MyProperty}" />

そして私のトップレベルのコントロール:

x:Name="root"
DataContext="{Binding AddNewClientViewModel, Source={StaticResource ServiceLocator}}"

これを機能させるためのサイコロはありません...

4

2 に答える 2

2

必要なのは、Dan Wahlin によって作成された DataContextProxy です。問題は、データ フォームに入ると、新しいデータ コンテキストが作成されることです。ビューのデータ コンテキストに戻る簡単な方法はありません。データ コンテキスト プロキシを使用すると、これを簡単に行うことができます。

于 2009-11-09T19:15:08.073 に答える
0

2 番目の TextBox では、親 VM が既に DataContext を持っているルート要素に ElementName バインディングを行うことができます。

<TextBox DataContent="{Binding DataContext, ElementName=rootLevelControl}" Text="{Binding property}"
于 2009-11-08T09:42:54.020 に答える