WPF UserControlにクラスをBindする

ユーザーコントロールに作成したクラスの値をバインドする

クラスの作成

値の変更を通知するクラスを作成する

 internal class Class1 : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;

    private void RaisePropertyChanged([CallerMemberName] String propertyName = "")
    {
        // propertyName 呼び出し元のプロパティ名
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    private string now;
    public string Now
    {
        get => now;
        set
        {
            now = value;
            RaisePropertyChanged();
        }
    }
}
 

UserControlの作成

ユーザーコントロールをコントロール名「UserControl1」として作成して、バインドした値を表示するTextBlock「textBlock1」を追加する

<StackPanel>
    <TextBlock x:Name="textBlock1" Text="textBlock1"/>
</StackPanel>
 

バインド可能なプロパティの作成

  • プロパティ名:Text
  • プロパティのタイプ:string
  • コントロール名:UserControl1
  • typeMetadataにはFrameworkPropertyMetadataを設定
    第1引数にはプロパティのタイプに合わせたデフォルトの値を設定、
    第2引数にコールバックするメソッドを設定
  • コールバックメソッドを作成する
public string Text   // プロパティ名
{
    get { return (string)GetValue(TextProperty); }
    set { SetValue(TextProperty, value); }
}

public static readonly DependencyProperty TextProperty =
    DependencyProperty.Register(
       name: "Text", // プロパティ名
       propertyType: typeof(string), // プロパティのタイプ
       ownerType: typeof(UserControl1), // コントロール名
       typeMetadata: new FrameworkPropertyMetadata(
           null,    // デフォルトの値
           new PropertyChangedCallback(OnTextChanged)) // コールバック メソッド名
        );

private static void OnTextChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
    UserControl1 ctrl = obj as UserControl1;
    if (ctrl != null)
    {
        ctrl.textBlock1.Text = ctrl.Text;
    }
}
 

MainWindowにUserControlを追加する

作成したUserControlとテスト用のButtonを追加する

<StackPanel>
    <local:UserControl1 Text="{Binding Now}"/>
    <Button Content="button" Click="Button_Click"/>
</StackPanel>
 

MainWindowのコード

MainWindowのDataContextを設定する。
テストボタンをクリックするたびにユーザーコントロールの値が変わる

public partial class MainWindow : Window
{
    private Class1 class1=new Class1();

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = class1;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        class1.Now = DateTime.Now.ToString();
    }
}
 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください