2012-02-27 9 views
3

私は次のようなシナリオを持っています。私はカードゲームを作成しています。その一部として、インターフェイスプログラミングをより簡単に、より良くするためにUserControlを作成したいと思います。私は、次のユーザーコントロールを作成しています:要素の背後にあるコードのデータバインディングを達成するにはどうすればよいですか?

は.cs

public partial class ChimeraUserControl : UserControl 
{ 
    private ChimeraViewModel Chimera { get; set; } 

    public ChimeraUserControl(Chimera chimera) 
    { 
     this.Chimera = new ChimeraViewModel(chimera); 
     InitializeComponent(); 
    } 
} 

を、私は2つのことを行うことができるようにしたい:結合を通じてChimeraを送ることができるように、このユーザーコントロールを使用した場合、また、すべてのテキストやその他の要素をこのオブジェクトにバインドするようにします。Chimera。私はたくさん検索しましたが、私を満足させるものは何も見つかりませんでした。

あなたはどう思いますか?

http://dev-for-fun.blogspot.com/2008/06/wpf-example-create-usercontrol-and.html

Binding from View-Model to View-Model of a child User Control in Silverlight? 2 sources - 1 target

そして、他のページの多くが、どれが十分なストレートフォワード思えませんし、そのコードをハッキングすることによって、私は見つけることができませんでした:私はすでに読んしようとした何

私の問題の解決策。

+0

upvotesから私はそれが実際の問題であると思っています。 –

+0

xamlまたはコードを追加して、必要なものを実行しようとしています。より正確に問題を表示します。 –

+0

コードはここにあります。後でXAMLを追加しますが、何もできないのでIMOは必要ありません。 –

答えて

4

まず第一に、それはバインディングシステムで

public static readonly DependencyProperty ChimeraProperty = 
    DependencyProperty.Register("Chimera ", typeof(ChimeraViewModel), 
    typeof(ChimeraUserControl), new FrameworkPropertyMetadata(null)); 

public ChimeraViewModel Chimera 
{ 
    get { return (ChimeraViewModel)GetValue(ChimeraProperty); } 
    set { SetValue(ChimeraProperty, value); } 
} 

第二に参加することができChimeraDependency Propertyを作る、あなたは

<UserControl x:Name="ChimeraViewRoot" ... > 

    <StackPanel> 
     <!-- ElementName Binding --> 
     <TextBlock Text="{Binding ElementName=ChimeraViewRoot, Path=Chimeria.Name}" /> 

     <!-- RelativeSource Binding --> 
     <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ChimeraView}}, Path=Chimeria.Name}" /> 

    </StackPanel> 
</UserControl> 
を結合 RelativeSourceElementNameを通して、あなたの Chimeriaプロパティを参照することができます

0を設定することもできますあなたの結合構文クリーナー

<UserControl x:Name="ChimeraViewRoot" ... > 
    <StackPanel DataContext="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ChimeraView}}, Path=Chimeria}" > 

     <TextBlock Text="{Binding Name}" /> 
     <TextBlock Text="{Binding Description}" /> 

    </StackPanel> 
</UserControl> 

を作るためにChimeraプロパティへのごUserControl内部統制のその値がUserControlを使用しています何から渡されたことになっているので、私は通常、あなたのUserControlUserControl.DataContextを定義示唆していません。 UserControlの内部に設定すると、後で特定のUserControlが期待どおりに動作しない理由を理解しようとすると、後で混乱する可能性があります。DataContext私は特定のUserControlと一緒に行くことになっているViewModelを作成するときに


は個人的に、私は私のViewModel私のカスタムUserControlで描画されるのすべてのインスタンスように、アプリケーションにDataTemplateを設定することを好みます。これは私がUserControl.DataContextは常にビジュアルツリーは、タイプChimeriaViewMmodelのオブジェクトに遭遇した時はいつでもこれは、暗黙のうちにChimeriaViewを使用する特定のViewModelタイプの

<DataTemplate DataType="{x:Type local:ChimeriaViewModel}"> 
    <local:ChimeriaView /> <!-- DataContext will always be ChimeriaViewModel --> 
</DataTemplate> 

になると仮定していることを意味します。

は例えば、以下はStackPanel知ることによってChimeriaViewオブジェクト

<ItemsControl ItemsSource="{Binding MyListOfChimeriaViewModels}" /> 

または私は通常もContentControl

<!-- Will get drawn using ChimeriaView due to DataTemplate defined above --> 
<ContentControl Content="{Binding MyChimeriaViewModelProperty}" /> 

のようなものを使用します単一のオブジェクトを表示するために、でいっぱいレンダリングされますChimeriaViewDataContextはタイプChimeriaViewModelのオブジェクトになりますが、私はDependencyPropertyを完全に取り除きます

<UserControl> 
    <StackPanel> 
     <!-- I know the DataContext is ChimeriaViewModel --> 
     <TextBlock Text="{Binding Name}" /> 
     <TextBlock Text="{Binding Description}" /> 

    </StackPanel> 
</UserControl> 
+0

ありがとう!今はまっすぐです! –

+0

質問:代わりにUserControlの代わりにDataTemplateを定義しますか? –

+0

@ Bruno私は、必要に応じて 'DataTemplates'と' UserControls'を使用します。自身のコントロール内の要素をグループ化することが意味のある場合は、 'UserControl'を使用します。それが単純なものであれば、あるいはより小さな範囲であれば、私は 'DataTemplate'を使用します。また、「DataTemplate」をそれが意味を成す場所に配置します。アプリケーション全体のテンプレートを定義している場合は、それを 'Application.Resources'に入れます。それがユーザコントロールのテンプレートなら、 'UserControl.Resources'に入れます。 – Rachel

0

あなたのクエストから理解できるものは、次のものを提案できます。

  1. これをUserControlの代わりにカスタムコントロールにする必要があります。 (SO追加したリンクや記事の上で説明したように)

    http://www.codeproject.com/Articles/49802/Create-a-WPF-Custom-Control-Part-2

  2. Control Authoring OverviewBindingをサポートするためにChimeraDependencyPropertyを作る -

    は助けのために、以下のリンクを見てください。

関連する問題