我正在尝试创建一个自定义的图像控件,因为我必须根据某些事件来操纵它的来源,我也将拥有相当多的这类控件。为此,我决定从Image继承我的类(“nfImage”),我希望有一个DP(实际上会反映事件),我可以将它绑定到视图模型。我在做:
class nfImage : Image
{
public static readonly DependencyProperty TagValueProperty =
DependencyProperty.Register("TagValue", typeof(int), typeof(nfImage), new UIPropertyMetadata(0));
public int TagValue
{
get { return (int)GetValue(TagValueProperty); }
set
{
SetValue(TagValueProperty, value);
if (this.Source != null)
{
string uri = (this.Source.ToString()).Substring(0, (this.Source.ToString()).Length - 5) + value.ToString() + ".gif";
ImageBehavior.SetAnimatedSource(this, new BitmapImage(new Uri(uri, UriKind.Absolute)));
}
}
}
}
问题是它不起作用。如果我从后面的代码设置TagValue的值,源更改,但如果我从xaml(通过dp)设置它没有任何反应,绑定也不起作用。我该怎么做?
答案 0 :(得分:1)
你不能使用setter,因为XAML没有直接调用它:它只调用SetValue(DependencyProperty,value)而不通过你的setter。您需要处理PropertyChanged事件:
class nfImage : Image
{
public static readonly DependencyProperty TagValueProperty =
DependencyProperty.Register("TagValue", typeof(int), typeof(nfImage), new UIPropertyMetadata(0, PropertyChangedCallback));
private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
var _this = dependencyObject as nfImage;
var newValue = dependencyPropertyChangedEventArgs.NewValue;
if (_this.Source != null)
{
string uri = (_this.Source.ToString()).Substring(0, (_this.Source.ToString()).Length - 5) + newValue.ToString() + ".gif";
//ImageBehavior.SetAnimatedSource(this, new BitmapImage(new Uri(uri, UriKind.Absolute)));
}
}
public int TagValue
{
get { return (int)GetValue(TagValueProperty); }
set { SetValue(TagValueProperty, value); }
}
}
答案 1 :(得分:1)
DependencyProperty的包装器属性只是样板,除了GetValue和SetValue之外永远不会做任何事情。这样做的原因是,除了从代码直接调用属性包装器之外的任何设置值都不使用包装器并直接调用GetValue和SetValue。这包括XAML和Bindings。您可以在DP声明中向元数据添加PropertyChanged回调,而不是包装器设置器,并在那里进行额外的工作。这是为任何SetValue调用调用的。