はじめに
「WPFで、XAMLでないところでユーザーコントロールをnewして、データとバインディングしておいて、
そのnewしてあるユーザーコントロールを、公開したい」
という都合がありまして、そのためのテストプログラムを書きました。
まずは、テストプログラムなので、UIのコントロールはxaml側に書いています。
ググると、いくつもサンプルは見つかるのですが、自分のイメージに近いものを書きました。
テストプログラムの内容
ラベル一つと、ボタン一つ
ボタンを押すと、ラベルの数値が1ずつ増えます
コード
MainWindow.xaml.cs
usingSystem.ComponentModel;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;namespaceWpfApp14{/// <summary>/// MainWindow.xaml の相互作用ロジック/// </summary>publicpartialclassMainWindow:Window{// バインディングさせたいデータソースClass1obj=newClass1(1);publicMainWindow(){InitializeComponent();// 実質的なバインディングのコードは、ここの2行label1.DataContext=(object)obj;//label1.SetBinding(Label.ContentProperty, new Binding("val1")); // どちらでもできたlabel1.SetBinding(Label.ContentProperty,nameof(Class1.val1));// どちらでもできた}privatevoidButton_Click(objectsender,RoutedEventArgse){// バインディングさせたデータソース内のプロパティを更新obj.val1+=1;}}classClass1:INotifyPropertyChanged// バインディングさせるソースは、INotifyPropertyChangedが必要{privateint_val1;publicintval1{get{return_val1;}set{_val1=value;OnPropertyChanged(nameof(val1));}}publiceventPropertyChangedEventHandlerPropertyChanged;privatevoidOnPropertyChanged(stringname){if(PropertyChanged!=null){PropertyChanged(this,newPropertyChangedEventArgs(name));}}publicClass1(intx){val1=x;}}}
MainWindow.xaml
<Windowx: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><Labelx:Name="label1"Height="40"/><ButtonClick="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