附加属性和绑定
问题描述:
为了设置一个类的常规属性我创建附加的行为:附加属性和绑定
public class LookupHelper
{
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.RegisterAttached("ItemsSource", typeof(object), typeof(LookupHelper), new UIPropertyMetadata(null, OnItemsSourceChanged));
private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = d as MyControl;
if(control == null)
return;
control.ItemsSource = (IEnumerable)e.NewValue;
}
public static object GetItemsSource(GridColumn column)
{
return column.GetValue(ItemsSourceProperty);
}
public static void SetItemsSource(GridColumn column, object value)
{
column.SetValue(ItemsSourceProperty, value);
}
}
在这里,MyControl ItemsSource属性是一个普通的属性,所以我不能将其绑定Xaml,因此这个附加行为。
现在,当我使用这个附加属性使用字符串或对象它的作品和我设置的断点被击中,但是当我用绑定标记设置它时,它永远不会运行。为什么这不起作用?
<MyControl ctrl:LookupHelper.ItemsSource="DataSource"/>; //It works
<MyControl ctrl:LookupHelper.ItemsSource="{Binding Path=MyDataSource}"/>; //Does not work
我需要做的是将ItemsSource属性设置为绑定指定的值。
答
在您的Get和Set方法中,您将接收对象定义为GridColumn,它应该是DependencyObject。
您可能也希望将DP的类型从对象更改为IEnumerable,因为您将其转换为更改处理程序中的DP类型。
答
您可以发布您使用的标记吗?另外,如果实际属性存在于一个对象上并且在那里有意义,那么我认为您应该在该对象上使用常规依赖属性,而不是辅助类的附加属性。
编辑 从MSDN: 为GetPropertyName访问的签名必须是:
public static object GetPropertyName(object target)
,为setPropertyName方法访问的签名必须是:
public static void SetPropertyName(object target, object value)
在你的情况,是GridColumn的正确的目标类型?
你在哪里设置断点?什么方法/线路在您认为应该调用的时候不被调用? – 2010-02-07 12:27:13
您是否尝试过使用'Binding'的'Source'属性而不是'Path'? (你需要指定源为'StaticResource') – mg007 2010-02-07 13:28:34