1. ホーム
  2. c#

[解決済み] コードビハインドで定義されたバインディングオブジェクト

2023-03-28 18:06:30

質問

コード ビハインドでインスタンス化されるオブジェクトがあります。たとえば、XAML は window.xaml と呼ばれ、window.xaml.cs 内でインスタンス化されます。

protected Dictionary<string, myClass> myDictionary;

XAMLマークアップだけを使って、このオブジェクトを例えばリストビューにバインドするにはどうしたらよいでしょうか?

更新しました。

(これはまさに私がテストコードで持っているものです)。

<Window x:Class="QuizBee.Host.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="{Binding windowname}" Height="300" Width="300"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
    </Grid>
</Window>

そしてcodebehindでは

public partial class Window1 : Window
{
    public const string windowname = "ABCDEFG";

    public Window1()
    {
        InitializeComponent();
    }
}

タイトルは "ABCDEFG" になるはずですよね? でも、結局何も表示されません。

どうすればいいのでしょうか?

このようにコントロールやフォームなどにDataContextを設定することができます。

DataContext="{Binding RelativeSource={RelativeSource Self}}"

明確化 :

上記の値に設定されるデータコンテキストは、コードの背後にあるどの要素 "owns" でも行われるはずです -- 従って Window の場合は Window 宣言で設定する必要があります。

このコードであなたの例が動作しています。

<Window x:Class="MyClass"
  Title="{Binding windowname}"
  DataContext="{Binding RelativeSource={RelativeSource Self}}"
  Height="470" Width="626">

このレベルで設定されたDataContextは、(子要素で明示的に変更しない限り)ウィンドウ内のどの要素にも継承されるので、ウィンドウのDataContextを設定した後は、CodeBehindにそのままバインドすればよいはずです。 プロパティに直接バインドすることができます。 に直接バインドすることができるはずです。