30

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

4

7 に答える 7

23

クリスが答えた答えはうまくいきました。私はテストしました、そしてそれは私のために働きました。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>

于 2009-03-04T16:58:23.520 に答える
10

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

<UserControl 
  DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">
于 2010-07-21T13:44:08.150 に答える
6
<UserControl.DataContext>
  <vm:ThisUCViewModel />
</UserControl.DataContext>
于 2010-01-30T13:58:46.960 に答える
2

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

<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>
于 2009-03-03T15:23:48.230 に答える
1

Silverlight 4では、次のようにすることでこれを機能させることができました。

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

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

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

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

于 2011-01-19T21:39:25.187 に答える
0

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

コードを介してそれを行う必要があります。

于 2009-03-03T17:43:48.613 に答える
0
<UserControl.Resources>
  <ResourceDictionary>
     <vm:YourModelx:Key="myModel"/>
  </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
   <Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>
于 2011-08-13T21:29:06.810 に答える