Saya memiliki Kontrol yang Disebut My_A_Control dan memiliki properti yang disebut Subjek

public class My_A_Control : Control

public static readonly DependencyProperty SubjectProperty = DependencyProperty.Register(
         "Subject", typeof(string), typeof(My_A_Control), new PropertyMetadata(Confirm);

Dan saya memiliki kontrol lain yang disebut My_B_Control yang Di dalam templatnya, My_A_Control digunakan

Jadi saya ingin mengubah nilai subjek di My_A_Control melalui My_B_Control

Saya pertama kali membuat properti sebagai berikut di My_B_Control

public class My_B_Control : Control

public static readonly DependencyProperty SubjectProperty =
           My_A_Control.SubjectProperty.AddOwner(typeof(My_B_Control));

        public string Subject
        {
            get { return (string) GetValue(SubjectProperty); }
            set { SetValue(SubjectProperty, value); }
        }

Dan kemudian saya menghubungkannya sebagai berikut

public My_B_Control()
{
  var ctl = new My_A_Control
   {
     Subject = Subject
   };
}

Tetapi metode ini tidak berhasil

Memperbarui:

 <Style TargetType="local:My_B_Control">
                <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:My_B_Control">
                    <Border x:Name="templateRoot" Background="{TemplateBinding Background}">
                        <Grid x:Name="PART_Root" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="30"/>
                            </Grid.ColumnDefinitions>
                            <Popup Grid.Column="0" VerticalOffset="4" x:Name="PART_Popup" StaysOpen="False"/>
                        </Grid>
...

Dan

public My_B_Control()
    {
      var ctl = new My_A_Control
       {
         Subject = Subject
       };
 _popup.Child = ctl;
    }

Pembaruan 2: kode ini berfungsi

Binding myBinding = new Binding();
            myBinding.Source = this;
            myBinding.Path = new PropertyPath("Subject");
            myBinding.Mode = BindingMode.TwoWay;
            myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            BindingOperations.SetBinding(ctl, My_A_Control.SubjectProperty, myBinding);
1
git test 12 Mei 2021, 18:17

1 menjawab

Jawaban Terbaik

Sesuatu seperti ini harus bekerja:

public My_B_Control()
{
     var ctl = new My_A_Control();

     ctl.SetBinding(My_A_Control.SubjectProperty, new Binding
     {
         Path = new PropertyPath("Subject"),
         Source = this
     });

     _popup.Child = ctl;
}
3
Clemens 12 Mei 2021, 15:44