2009-03-03 11 views
30

コンストラクタではなく、XAMLのグリッドにDataContextを設定するにはどうすればよいですか?ここでSilverlight - コンストラクタではなくXAMLでDataContextを設定していますか?

は、私はコンストラクタでそれを行う方法である(LayoutRootは、XAMLグリッドXAMLで定義されている):

this.LayoutRoot.DataContext = this.HPVM; 

私は右のXAMLでそれを行うことを好むだろうが、私はどのように知りません。 XAMLのHPVMオブジェクトを参照してください。 HPVMは、USerControlクラスのパブリックプロパティです。

これは上で示したようにうまく動作しますが、XAMLでUserControlクラスのプロパティをどのようにするかを常に知りたいだけでなく、常にコードで行う必要があります。ここで

は、関連するすべてのコードです:

<UserControl x:Class="SilverlightApplication1.SLHolePattern" x:Name="HolePatternsControl" 
    xmlns="http://schemas.microsoft.com/client/2007" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"  
    xmlns:controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls" 
    xmlns:local="clr-namespace:SilverlightApplication1"  
    xmlns:GeoPatterns="clr-namespace:GeoPatterns" 
    Height="700"> 


    <UserControl.Resources> 
    ... 

そしてここでは、DataContextのが現在設定されている私のコンストラクタです:

namespace SilverlightApplication1 
{ 
    public partial class SLHolePattern : UserControl, INotifyPropertyChanged 
    { 
     public HolePatternsViewModel HPVM; 

     public SLHolePattern() 
     { 
      InitializeComponent(); 

      this.HPVM=new HolePatternsViewModel(); 
      this.LayoutRoot.DataContext = this.HPVM; 
      ...more code here 
     } 

それはすべてが正常に動作しますが、私はどれだけに学びたいですコードではなく、XAMLでDataContextを設定します。で、XAMLでクラスのインスタンスを作成>フォームなど

-

答えて

24

クリスさんの答えはうまくいきました。 私はテストして、それは私のために働いた。 クラスをXAML(UserControl.Resources内)でインスタンス化し、 を使用して、datacontextを静的リソースにバインドできます。

フォローコード:

 

<UserControl ...> 
    <UserControl.Resources> 
     <myNS:MyClass x:Name="TheContext" x:Key="TheContext"></myNS:MyClass> 
    </UserControl.Resources> 
    <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource TheContext}" > 
     <TextBlock Text="{Binding Path=Field1}"> 
     </TextBlock> 
    </Grid> 
</UserControl> 
 
+0

XAMLでViewModelクラスをインスタンス化すると、コードビハインドコンストラクタでも参照できますか?私が尋ねる理由は、フォームがユーザに表示される前に、現在、コンストラクタのViewModelにいくつかの値を設定しているということです。 – MattSlay

+3

はい、できます。次のようにしてください: var aCustomer = this.Resources ["Cust"] as Customer; aCustomer.Name = "abc"; – Klinger

+2

x:Name属性を追加するのを忘れました。 x:KeyはXAML内で動作し、x:Nameはオブジェクトをコードに見えるようにします。 – Klinger

2

がHPVMは、このパブリックのメンバーであり、このような何か.....

<Grid DataContext="{Binding Path=HPVM}"> 
</Grid> 

を試してみてくださいその後、

(あなたのxmlns名前空間を追加することを忘れないでください)....自分のリソースセクションに
<my:bogart x:Key="franken"/> 

をこのような何かを追加し、追加したばかりの静的リソースへのデータコンテキストをバインド....

<Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource franken}"> 
    <TextBox Background="Red" Foreground="White" Text="{Binding Path=sum}" /> 
</Grid> 
+0

動作しません。何とかHPVMがどこにあるかを示すパスが必要です。コードメソッドでは、それは "これ"。一部はあります。 HPVMはクラスのプロパティです。私はインスタンス化されたクラスを参照してHPVMにアクセスする正しい方法を理解できません。 – MattSlay

+0

元の質問にさらにコードを追加しました。 – MattSlay

+0

2番目のコード例は機能しますが、* XAMLにオブジェクトを作成します。 XAMLからコンストラクタで作成されたオブジェクトインスタンスにアクセスすることについてはまだ説明していません。私はそれができないことを伝えることができます。 objectでコードを作成する場合は、DataContextをcodeから設定する必要があります。 – MattSlay

0

これはできません(WPFでは{Binding RelativeSource={RelativeSource Self}}で可能ですが、Silverlightは制限されています)。

コードで行う必要があります。

6
<UserControl.DataContext> 
    <vm:ThisUCViewModel /> 
</UserControl.DataContext> 
10

次怪物は、Silverlightの4のSilverlight 4では

<UserControl 
    DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}"> 
+2

私はちょうど私の口の中で少しを投げた。 – Cheeso

1

で動作しますが、私は次のようにして、この作業を取得することができました:

Page/UserControlにx:Name = "myPage"を与える

コントロール結合では、通常の要素bidining構文を使用します。私の場合、私は私のItemsSourceプロパティのための背後に私のコード内のオブジェクトの観察可能なコレクションにバインドしたい:私はDataContextのでこれを試していない

<ComboBox 
    ItemsSource={Binding ElementName=myPage, Path=MyObservableObjectList, Mode=TwoWay} 

ていますが、私としてのDataContextのための結合要素に要素を行うことができます知っていますコンテキストを、ページ上の他のドロップダウンの選択項目に基づいているグリッドに対して実行します。

+0

ブリリアント!それは確かに私のためにそれを固定。どうもありがとう。 – SGarratt

0
<UserControl.Resources> 
    <ResourceDictionary> 
    <vm:YourModelx:Key="myModel"/> 
    </ResourceDictionary> 
</UserControl.Resources> 
<UserControl.DataContext> 
    <Binding Source="{StaticResource myModel}"/> 
</UserControl.DataContext> 
+0

を追加するだけで済みます。 – Jacfay

関連する問題