我有以下代码。正在调用PropertyChanged事件,但getter和setter不是。我不能为我的生活看到为什么不。我有其他属性发生相同的事情,但值正在设置。这是一个自定义控件,如果这会产生影响。当我在get / set处设置断点时,我什么也得不到。但是,propertychanged返回正确的值。非常感谢任何帮助。
/// <summary>
/// Identifies the PlacementTarget dependency property.
/// </summary>
public static readonly DependencyProperty PlacementTargetProperty =
DependencyProperty.RegisterAttached(
"PlacementTarget",
typeof(UIElement),
typeof(FunctionPanel),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits, PlacementTargetPropertyChanged)
);
/// <summary>
/// Gets or setsthe PlacementTarget of tooltips for all child controls.
/// </summary>
public UIElement PlacementTarget
{
get { return (UIElement)GetValue(PlacementTargetProperty); }
set { SetValue(PlacementTargetProperty, value); }
}
/// <summary>
/// Sets the value of the PlacementTarget dependency property.
/// </summary>
/// <param name="target">Target object.</param>
/// <param name="value">Value argument.</param>
public static void SetPlacementTarget(DependencyObject target, UIElement value)
{
target.SetValue(PlacementTargetProperty, value);
}
/// <summary>
/// Gets the value of the PlacementTarget dependency property.
/// </summary>
/// <param name="target">Target object.</param>
public static UIElement GetPlacementTarget(DependencyObject target)
{
return (UIElement)target.GetValue(PlacementTargetProperty);
}
/// <summary>
/// This method is called when the PlacementTarget dependency property changes value.
/// </summary>
/// <param name="sender">Sender object.</param>
/// <param name="e">Event arguments.</param>
private static void PlacementTargetPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
ToolTipService.SetPlacementTarget(sender, (UIElement)e.NewValue);
}
其他信息
所以基本上PlacementTargetPropertyChanged处理得很好。我想问题是这个特定的DP实际上并没有传播给孩子们。这是XAML片段:
<controls:FunctionPanel BetweenShowDelay="0"
InitialShowDelay="500"
IsError="False"
Message="MESSAGE"
Placement="Right"
PlacementTarget="{Binding RelativeSource={RelativeSource Self}}"
ShowDuration="60000" />
除了PlacementTarget之外的所有DP都将转到子元素。我已经尝试删除绑定但它没有任何区别。
我正在使用Snoop检查其他DP以检查值。我创建了一个Int类型的InitialShowDelay DP。当我将值设置为5000时,所有子控件都会继承,并且工具提示会在出现之前延迟5秒。我可以通过在我的PlacementTargetPropertyChanged方法上放置一个断点来验证绑定是否正在发送正确的控件。
所以似乎PlacementTarget工作正常。我的Placement附加属性的默认值(设置为“right”)将被忽略。当我通过XAML设置它时,它仍然不起作用。但是,如果我将值设置为“上”,“左”或“下”,则工具提示会显示在正确的位置。
答案 0 :(得分:7)
XAML将直接调用SetValue
和GetValue
方法,这就是为什么你不应该在静态Set
/ Get
方法中放置任何逻辑,而是使用属性改变了处理程序。
答案 1 :(得分:6)
Setter
和Getter
只是您编码的.NET Wrappers。从XAML绑定时,将调用GetXXXX
和SetXXX
,而不是属性Getter
和Setter
。
您还可以访问DependencyProperty
PropertyChanged
回调,每次更改属性时都会调用此函数。
答案 2 :(得分:-1)
我找到了吸气剂和制定者似乎没有被解雇的原因。在我的placement依赖项属性中,我将默认值设置为PlacementMode.Right。 WPF忽略默认值。然后我在XAML中将其设置为Placement =“Right”。由于此值与默认值相同,因此再次忽略它。通过将默认值更改为PlacementMode.Relative,我现在可以在XAML中成功将值设置为“Right”。如果我愿意,这确实阻止我使用Relative,但我想这可以通过将我的属性转换为一个对象来解决,该对象的默认值为null。