ユーザーコントロールに作成したクラスの値をバインドする
クラスの作成
値の変更を通知するクラスを作成する
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();
}
}