我有一个相当简单的用户控件(RatingControl),它具有如下定义的依赖项属性:
public partial class RatingControl : UserControl
{
public RatingControl()
{
InitializeComponent();
}
public static readonly DependencyProperty RatingValueProperty = DependencyProperty.Register("RatingValue", typeof(double), typeof(RatingControl), new PropertyMetadata(0.0));
public double RatingValue
{
set
{
double normalizeValue = 0.0;
if (value > 10.0)
{
normalizeValue = 10.0;
}
else if (value > 0.0)
{
normalizeValue = value;
}
SetValue(RatingValueProperty, normalizeValue);
RenderRatingValue();
}
get { return (double)GetValue(RatingValueProperty); }
}
...
如果我直接分配,该控件将正确接收RatingValue:
<gtcontrols:RatingControl RatingValue="2.0" />
但是,如果我尝试使用数据绑定进行分配,则不起作用。从不调用RatingValue的“set”代码,也没有在调试输出窗口中看到数据绑定错误。 请注意,我尝试将相同的值分配给标准属性(宽度),在这种情况下,该值正确传递给它。
<StackPanel>
<TextBox Name="Test" Text="200.0" />
<gtcontrols:RatingControl Width="{Binding ElementName=Test, Path=Text}" RatingValue="{Binding ElementName=Test, Path=Text}" />
<TextBlock Text="{Binding ElementName=Test, Path=Text}" />
</StackPanel>
不仅TextBlock正确接收值。 RatingControl接收的是宽度,正确设置为200像素;但是,未设置RatingValue(方法设置甚至没有调用)
我错过了什么? 提前谢谢。
答案 0 :(得分:3)
问题是绑定系统不使用CLR属性包装器(getter和setter)来分配依赖项属性的值。这些只是为了方便,所以您可以像在代码中的普通属性一样使用该属性。在内部,它使用SetValue()/ GetValue()方法。
因此,值规范化的适当位置是依赖属性的属性更改回调:
public static readonly DependencyProperty RatingValueProperty =
DependencyProperty.Register("RatingValue", typeof(double), typeof(RatingControl),
new PropertyMetadata(0.0, new PropertyChangedCallback(RatingValuePropertyChanged))));
static void RatingValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var ratingControl = (RatingControl)sender;
var val = (double)e.NewValue;
double normalizeValue = 0.0;
if (val > 10.0)
{
normalizeValue = 10.0;
}
else if (val > 0.0)
{
normalizeValue = val;
}
ratingControl.RatingValue = normalizeValue;
}