web-dev-qa-db-ja.com

Silverlight-コンストラクターではなくXAMLでDataContextを設定していますか?

コンストラクターではなく、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を設定する方法を学びたいだけです。

30
MattSlay

クリスが答えた作品はうまくいきました。私はテストし、それは私のために働いた。 XAML(UserControl.Resources内)でクラスをインスタンス化し、データコンテキストを静的リソースにバインドできます。

コードに従う:


<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>
24
Klinger

次の怪物は、Silverlight 4で動作します

<UserControl 
  DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">
10
Chui Tey
<UserControl.DataContext>
  <vm:ThisUCViewModel />
</UserControl.DataContext>
6
someguy

このようなものを試してください.....

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

ここで、HPVMはこれの公開メンバーです->フォームなど.

リソースセクションに次のようなものを追加して、xamlでクラスのインスタンスを作成します。(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>
2
Muad'Dib

Silverlight 4では、次の操作を行うことでこれを機能させることができました。

Page/UserControlにx:Name = "myPage"を指定します

コントロールバインディングでは、通常の要素入札構文を使用します。私の場合、ItemsSourceプロパティのコードビハインドでオブジェクトの監視可能なコレクションにバインドしたいです。

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

私はこれをDataContextで試したことはありませんが、ページ上の他のドロップダウンの選択された項目に基づいたコンテキストを持つグリッドに対してこれを行うため、DataContextの要素間バインディングを行うことができることを知っています。

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

これは不可能です(WPFでは{Binding RelativeSource={RelativeSource Self}}が、Silverlightはより制限されています。

あなたはコードを通してそれをしなければなりません。

0
Srdjan Jovcic