.NET 5のWPFプロジェクトで外部から複数の値をバインドさせたいUserControlを作っています。そのためUserControlに独自型Texts
の依存関係プロパティValue
を作成し、UserControlの利用者となる親画面のxamlからValue
をセットすることで、UserControlのコードビハインドで値を加工したりした上でUserControlのViewに反映させたいと考えています。
しかし、以下のコードで親画面(ここではコードビハインド)からTexts
を作成してバインドさせても、画面に内容が反映されません。
独自型のバインドは不可能で、バインドしたい値が複数あったら1つ1つ依存関係プロパティを設定してバインドしなければならないのでしょうか?
※以下コードでは親画面側でReactiveProperty<Texts>
を使ってバインドさせているつもりです。
Texts.cs
c#
1using System.Windows; 2using System.Windows.Controls; 3 4namespace WpfApp1 5{ 6 public class Texts 7 { 8 public int A { get; set; } = 5; 9 public string B { get; set; } = ""; 10 public double? C { get; set; } 11 } 12}
UserControl.xaml
xaml
1<UserControl x:Class="WpfApp1.UserControl1" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:local="clr-namespace:WpfApp1" 7 mc:Ignorable="d" 8 d:DesignHeight="200" d:DesignWidth="200"> 9 <Grid Background="White"> 10 <Grid.RowDefinitions> 11 <RowDefinition Height="*"/> 12 <RowDefinition Height="*"/> 13 <RowDefinition Height="*"/> 14 </Grid.RowDefinitions> 15 <TextBlock Grid.Row="0" Text="{Binding Value.A}" Foreground="Black"/> 16 <TextBlock Grid.Row="1" Text="{Binding Value.B}" Foreground="Black"/> 17 <TextBlock Grid.Row="2" Text="{Binding Value.C}" Foreground="Black"/> 18 </Grid> 19</UserControl> 20
UserControl.xaml.cs
c#
1using System.Windows; 2using System.Windows.Controls; 3 4namespace WpfApp1 5{ 6 /// <summary> 7 /// UserControl1.xaml の相互作用ロジック 8 /// </summary> 9 public partial class UserControl1 : UserControl 10 { 11 public UserControl1() 12 { 13 InitializeComponent(); 14 } 15 16 public static readonly DependencyProperty ValueProperty = 17 DependencyProperty.Register( 18 "Value", 19 typeof(Texts), 20 typeof(UserControl1), 21 new PropertyMetadata(new Texts())); 22 23 public Texts Value 24 { 25 get { return (Texts)GetValue(ValueProperty); } 26 set { SetValue(ValueProperty, value); } 27 } 28 } 29}
MainWindow.xaml
xaml
1<Window x:Class="WpfApp1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp1" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <Grid> 10 <Grid.ColumnDefinitions> 11 <ColumnDefinition Width="*"/> 12 <ColumnDefinition Width="*"/> 13 <ColumnDefinition Width="*"/> 14 </Grid.ColumnDefinitions> 15 <local:UserControl1 Grid.Column="0" Value="{Binding ValueA.Value}"/> 16 <local:UserControl1 Grid.Column="1" Value="{Binding ValueB.Value}"/> 17 <local:UserControl1 Grid.Column="2" Value="{Binding ValueC.Value}"/> 18 </Grid> 19</Window>
MainWindow.xaml.cs
c#
1using Reactive.Bindings; 2using System.Windows; 3 4namespace WpfApp1 5{ 6 /// <summary> 7 /// Interaction logic for MainWindow.xaml 8 /// </summary> 9 public partial class MainWindow : Window 10 { 11 public MainWindow() 12 { 13 InitializeComponent(); 14 ValueA = new ReactiveProperty<Texts>(new Texts { A = 1, B = "Ab", C = 10.0 }); 15 ValueB = new ReactiveProperty<Texts>(new Texts { A = 2, B = "Bb", C = 222.22 }); 16 ValueC = new ReactiveProperty<Texts>(new Texts { A = 3, B = "Cb", C = null }); 17 } 18 19 public ReactiveProperty<Texts> ValueA { get; } 20 public ReactiveProperty<Texts> ValueB { get; } 21 public ReactiveProperty<Texts> ValueC { get; } 22 } 23}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/17 00:59