はじめに
「WPFで、XAMLでないところでユーザーコントロールをnewして、データとバインディングしておいて、
そのnewしてあるユーザーコントロールを、公開したい」
という都合がありまして、そのためのテストプログラムを書きました。
まずは、テストプログラムなので、UIのコントロールはxaml側に書いています。
ググると、いくつもサンプルは見つかるのですが、自分のイメージに近いものを書きました。
2020/1/27追記:
続きの記事を書きました。
「C#製コンポーネントで、WPF UserControlを公開したい」のサンプルコード
です。
テストプログラムの内容
ラベル一つと、ボタン一つ
ボタンを押すと、ラベルの数値が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