LoginSignup
2
6

More than 3 years have passed since last update.

WPF コードによる UIControlとのバインディング

Last updated at Posted at 2020-01-22

はじめに

「WPFで、XAMLでないところでユーザーコントロールをnewして、データとバインディングしておいて、
そのnewしてあるユーザーコントロールを、公開したい」
という都合がありまして、そのためのテストプログラムを書きました。
まずは、テストプログラムなので、UIのコントロールはxaml側に書いています。

ググると、いくつもサンプルは見つかるのですが、自分のイメージに近いものを書きました。

2020/1/27追記:
続きの記事を書きました。
「C#製コンポーネントで、WPF UserControlを公開したい」のサンプルコード
です。

テストプログラムの内容

image.png

ラベル一つと、ボタン一つ
ボタンを押すと、ラベルの数値が1ずつ増えます

コード

MainWindow.xaml.cs
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace WpfApp14
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        // バインディングさせたいデータソース
        Class1 obj = new Class1(1);

        public MainWindow()
        {
            InitializeComponent();

            // 実質的なバインディングのコードは、ここの2行
            label1.DataContext = (object)obj;
            //label1.SetBinding(Label.ContentProperty, new Binding("val1")); // どちらでもできた
            label1.SetBinding(Label.ContentProperty, nameof(Class1.val1)); // どちらでもできた
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // バインディングさせたデータソース内のプロパティを更新
            obj.val1 += 1;
        }
    }

    class Class1 : INotifyPropertyChanged  // バインディングさせるソースは、INotifyPropertyChangedが必要
    {
        private int _val1;
        public int val1
        {
            get { return _val1; }
            set
            {
                _val1 = value;
                OnPropertyChanged(nameof(val1));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
        public Class1(int x)
        {
            val1 = x;
        }
    }
}
MainWindow.xaml
<Window x:Class="WpfApp14.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp14"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <Label x:Name="label1" Height="40" />
        <Button Click="Button_Click" Content="Push" />
    </StackPanel>
</Window>

参考にした記事

方法 : コードでバインディングを作成する
https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/data/how-to-create-a-binding-in-code
WPFでコードだけどバインドするときの例
https://mohmongar.net/?p=951
C#(MVVM):ソースコードにてバインディング設定する方法
https://www.kakistamp.com/entry/2018/06/22/204440

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6