WPF UserControl事件只调用一次?

WPF UserControl事件只调用一次?,wpf,events,user-controls,Wpf,Events,User Controls,我需要将用户控件的双向属性绑定到包含该控件的用户控件的属性。我还需要在子对象中的代码中为属性设置一个默认值(从XAML标记中很难做到) SetValue(ProductNameProperty, value_required); PropertyChanged(this, new PropertyChangedEventArgs("ProductName")); 如果我从子构造函数调用代码,则会在父构造函数中设置值,但不会触发更改回调例程(我的理解是,创建子构造函数时父构造函数还不存在)

我需要将用户控件的双向属性绑定到包含该控件的用户控件的属性。我还需要在子对象中的代码中为属性设置一个默认值(从XAML标记中很难做到)

SetValue(ProductNameProperty, value_required); 
PropertyChanged(this, new PropertyChangedEventArgs("ProductName")); 
如果我从子构造函数调用代码,则会在父构造函数中设置值,但不会触发更改回调例程(我的理解是,创建子构造函数时父构造函数还不存在)

SetValue(ProductNameProperty, value_required); 
PropertyChanged(this, new PropertyChangedEventArgs("ProductName")); 
我的当前解决方法是捕获子级的加载的事件,并从处理程序调用代码。无论如何多次调用as-Loaded,我都需要设置一个标志,以便仅在第一次设置属性。我不喜欢这种方式,但我不知道是否有一个单一的镜头事件,可以使用,或者如果这可以做其他。根据您的经验是否有任何反馈?

用于使用包含默认值的DependencyProperty和传入对象,例如

    public static readonly DependencyProperty ProductNameProperty =
            DependencyProperty.Register(
                "ProductName",
                typeof(string),
                typeof(ProductTextBox),
                new FrameworkPropertyMetadata(null, // Default Value
                    FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    new PropertyChangedCallback(ChangeProductName)) );
SetValue(ProductNameProperty, value_required); 
PropertyChanged(this, new PropertyChangedEventArgs("ProductName")); 
如果默认值是每个实例的变量,并且不同,则可能是

SetValue(ProductNameProperty, value_required); 
PropertyChanged(this, new PropertyChangedEventArgs("ProductName")); 

如果PropertyChanged在构造函数中不起作用,则可能在构造函数中或在加载的事件中发送它。我还没试过这个…

谢谢Richard。在我的父用户控件中,我使用“Step=“{Binding ElementName=ui\u UserControl,Path=Step,Mode=TwoWay}”将子属性步骤绑定到xaml中的父属性步骤,ui\u UserControl是“this”UserControl。因此我绑定在源中而不是目标中。我可以使用SetValue在子属性中设置值(第二个建议)。在这种情况下,PropertyChanged属于哪个对象/类型?我已经在子级和父级中为属性步骤定义了一个默认值。但是它不会触发父级PropertyChanged回调。这就是我的问题所在。当所有者更改属性时,应该通过SetValue/PropertyChanged-和bindi来完成ngs将更新。但是,最好使用另一个对象来管理状态。Richard,我知道如何使用SetValue/GetValue。我的理解是,当值更改时,DP系统将发出一个事件,以便绑定工作。我不知道PropertyChanged(这是新的PropertyChangedEventArgs()产品名称“));必须在此处执行,这似乎是一个单独的CLR事件,我应该将其添加到我的子用户控件中,并使用此代码引发。但为了有用,我需要注册到此事件通知并在父UC中作出反应。但这与DP无关。如果这是错误的,我不理解。我仍然对存在这样的事件感兴趣将只触发一次,并且在构建可视化祖先之后触发(因此,这不是初始化事件)。但是,我通过在父级而不是子级中设置属性值解决了我的问题。无论如何,感谢您的建议。
SetValue(ProductNameProperty, value_required); 
PropertyChanged(this, new PropertyChangedEventArgs("ProductName"));