例如,我有一个依赖属性可以更改 Canvas 的 ScaleTransform,但如果它低于零,则会引发错误。当然,如果发生这种情况,我可以在代码中将其强制为零,但我宁愿使用更好的方法,例如使用 Silverlight 中不存在的 udouble(无符号双精度),甚至设置最小/最大值DependencyProperty 中的某处。
这里最好的方法是什么?
例如,我有一个依赖属性可以更改 Canvas 的 ScaleTransform,但如果它低于零,则会引发错误。当然,如果发生这种情况,我可以在代码中将其强制为零,但我宁愿使用更好的方法,例如使用 Silverlight 中不存在的 udouble(无符号双精度),甚至设置最小/最大值DependencyProperty 中的某处。
这里最好的方法是什么?
如果您要在 DependencyProperty 中处理它,我建议在PropertyChangedCallback中处理它,它会验证该值是否在正确的范围内,如果不是则覆盖它。
您也可以在依赖属性之外处理这个问题。例如:
除此之外,在您的 PropertyChangedCallback 中,一个典型的模式将在抛出异常之前恢复不正确/超出范围的值。
如果您不执行还原,实际上仍会设置超出范围的值,并且您的状态将无效。
您将在一些 Silverlight 工具包中看到这种“穷人的胁迫”的示例。这是AutoCompleteBox.cs 源代码。
模式类似于:
int newValue = (int)e.NewValue;
if (newValue < 0)
{
source._ignorePropertyChange = true;
d.SetValue(e.Property, e.OldValue);
throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, Properties.Resources.AutoComplete_OnMinimumPopulateDelayPropertyChanged_InvalidValue, newValue), "value");
}
您也可以以类似的方式实现您自己的“只读”Silverlight 依赖项属性,但它需要一个私有字段来指示您是在设置还是恢复该值。