2009-06-08 13 views
5

私はこれ持っている:私のViewModelもプロパティ「フォームフィールドを持っているしかしStackPanelをViewModelにバインドするにはどうすればよいですか?私の見解では

private string _title; 
public string Title 
{ 
    get 
    { 
     return _title; 
    } 

    set 
    { 
     _title = value; 
     OnPropertyChanged("Title"); 
    } 
} 

これは簡単ですし、うまくを働く私のViewModelのTitleプロパティに結合し、
<TextBlock Text="{Binding Title}"/> 

を" StackPanelで、他の多くのUserControlを含んでいます:

これを私のビューからどのようにバインドするのですか?

ASP.NETでは、PlaceHolder要素がありました。私は同じ機能を持つものを探しています。

擬似コード:まず

<PlaceHolder Content="{Binding FormFields}"/> 

答えて

18

、しないでください。 VMからUIを指示する代わりに、データ(モデル)を指示する必要があります。つまり、プロパティタイプはObservableCollection<FormField>である必要があります。次のように次に、あなたのビューが結合するであろう:

<ContentPresenter Content="{Binding FormFields}"/> 
+0

Hmmm、OK、ItemsSourceと連携することができませんでした。そのため、ViewModelプロパティを非常に便利なパターンに見えるXAML要素にすることができますが、これを再考する必要がありますContentPresenterは今のところうまく動作します。ありがとうございます。 –

+0

StackPanelのItemsSourceプロパティはありません。 –

+0

@Greg Sansom:修正されました。 –

0

あなたはBorderかを使用してみました:

<ItemsControl ItemsSource="{Binding FormFields}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel/> 
     <ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

あなたがStackPanelをつかむと、ビジュアルツリーでそれを固執するContentPresenterを使用することができ、と述べました単なる平野Grid

<Border Content="{Binding FormFields}" /> 

まだ、私はデザインに疑問を呈しています。フォームフィールドはビュー内に存在する必要があり、ビューはビューモデルタイプに基づいてインスタンス化されたデータテンプレートで指定する必要があります。私はあなたがコードでやっていることを個人的にはしません。

乾杯。

関連する問題