Silverlight-コンストラクターではなくXAMLでDataContextを設定しますか?
-
03-07-2019 - |
質問
コンストラクターではなく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(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>
他のヒント
以下の怪物は、Silverlight 4で動作します
<UserControl
DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">
<UserControl.DataContext>
<vm:ThisUCViewModel />
</UserControl.DataContext>
このようなものを試してください.....
<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>
Silverlight 4では、次の操作を行うことでこれを機能させることができました。
Page / UserControlにx:Name =&quot; myPage&quot;を与えます
コントロールバインディングでは、通常の要素入札構文を使用します。私の場合、ItemsSourceプロパティのコードビハインドでオブジェクトの監視可能なコレクションにバインドしたいです。
<ComboBox
ItemsSource={Binding ElementName=myPage, Path=MyObservableObjectList, Mode=TwoWay}
これをDataContextで試したことはありませんが、ページ上の他のドロップダウンの選択されたアイテムに基づいたコンテキストを持つグリッドに対してこれを行うため、DataContextの要素間バインディングを行うことができます。
これは不可能です(WPFでは {Binding RelativeSource = {RelativeSource Self}}
を使用できますが、Silverlightはより制限されています。
コードを介して行う必要があります。
<UserControl.Resources>
<ResourceDictionary>
<vm:YourModelx:Key="myModel"/>
</ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
<Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>