web-dev-qa-db-ja.com

XAMLの変数にアクセスするコード

Sample.xaml.cs asp.netのようなファイルのパブリック変数にアクセスするにはどうすればよいですか<%=VariableName%>

47
Murat

これを行うにはいくつかの方法があります。

  • コードビハインドからリソースとして変数を追加します。

    myWindow.Resources.Add("myResourceKey", myVariable);
    

    次に、XAMLからアクセスできます。

    <TextBlock Text="{StaticResource myResourceKey}"/>
    

    XAMLの解析後に追加する必要がある場合は、DynamicResourceの代わりに上記のStaticResourceを使用できます。

  • 変数をXAMLの何かのプロパティにします。通常、これはDataContextを介して機能します。

    myWindow.DataContext = myVariable;
    

    または

    myWindow.MyProperty = myVariable;
    

    この後、XAMLのすべてのものがBindingを介してアクセスできます。

    <TextBlock Text="{Binding Path=PropertyOfMyVariable}"/>
    

    または

    <TextBlock Text="{Binding ElementName=myWindow, Path=MyProperty}"/>
    
63
Robert Macnee

バインディングでは、DataContextが使用されていない場合、これをコードビハインドのコンストラクタに追加するだけです。

this.DataContext = this;

これを使用して、コード内のすべてのプロパティがバインディングにアクセス可能になります。

<TextBlock Text="{Binding PropertyName}"/>

別の方法は、XAMLのルート要素に名前を付けるだけです。

x:Name="root"

XAMLは分離コードの部分クラスとしてコンパイルされるため、すべてのプロパティに名前でアクセスできます。

<TextBlock Text="{Binding ElementName="root" Path=PropertyName}"/>

注:アクセスできるのはプロパティのみです。フィールドではありません。 set;およびget;または{Binding Mode = OneWay}が必要です。 OneWayバインディングを使用する場合、基になるデータはINotifyPropertyChangedを実装する必要があります。

24
yossharel

WPFの手っ取り早いWindowsでは、WindowのDataContextをウィンドウ自体にバインドすることを好みます。これはすべてXAMLで実行できます。

Window1.xaml

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    DataContext="{Binding RelativeSource={RelativeSource self}}"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <TextBlock Text="{Binding Path=MyProperty1}" />
        <TextBlock Text="{Binding Path=MyProperty2}" />
        <Button Content="Set Property Values" Click="Button_Click" />
    </StackPanel>
</Window>

Window1.xaml.cs

public partial class Window1 : Window
{
    public static readonly DependencyProperty MyProperty2Property =
        DependencyProperty.Register("MyProperty2", typeof(string), typeof(Window1), new UIPropertyMetadata(string.Empty));

    public static readonly DependencyProperty MyProperty1Property =
        DependencyProperty.Register("MyProperty1", typeof(string), typeof(Window1), new UIPropertyMetadata(string.Empty));

    public Window1()
    {
        InitializeComponent();
    }

    public string MyProperty1
    {
        get { return (string)GetValue(MyProperty1Property); }
        set { SetValue(MyProperty1Property, value); }
    }

    public string MyProperty2
    {
        get { return (string)GetValue(MyProperty2Property); }
        set { SetValue(MyProperty2Property, value); }
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // Set MyProperty1 and 2
        this.MyProperty1 = "Hello";
        this.MyProperty2 = "World";
    }
}

上記の例では、WindowのDataContextプロパティで使用されているバインディングに注意してください。これは「データコンテキストを自分に設定する」という意味です。 2つのテキストブロックはMyProperty1およびMyProperty2にバインドされ、ボタンのイベントハンドラーはこれらの値を設定します。これらの値は、プロパティとして2つのTextBlocksのTextプロパティに自動的に伝達されます。依存関係プロパティです。

9
Phil Price

また、「Binding」はDependencyObjectのDependencyPropertyでのみ設定できることに注意してください。 XAMLのオブジェクトに非DependencyProperty(たとえば、通常のプロパティ)を設定する場合、コードビハインドでリソースを使用するRobertの最初の方法を使用する必要があります。

3
Sheridan