Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获得';这';依赖项属性内的指针已更改回调_C#_Dependency Properties - Fatal编程技术网

C# 获得';这';依赖项属性内的指针已更改回调

C# 获得';这';依赖项属性内的指针已更改回调,c#,dependency-properties,C#,Dependency Properties,我在类中具有以下依赖项属性: class FooHolder { public static DependencyProperty CurrentFooProperty = DependencyProperty.Register( "CurrentFoo", typeof(Foo), typeof(FooHandler), new PropertyMetadata(OnCurrentFooChanged)); p

我在类中具有以下依赖项属性:

class FooHolder
{
    public static DependencyProperty CurrentFooProperty = DependencyProperty.Register(
        "CurrentFoo",
        typeof(Foo), 
        typeof(FooHandler),
        new PropertyMetadata(OnCurrentFooChanged));

    private static void OnCurrentFooChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        FooHolder holder = (FooHolder) d.Property.Owner; // <- something like this

        // do stuff with holder
    }
}
class FooHolder
{
公共静态DependencyProperty CurrentFooProperty=DependencyProperty.Register(
“CurrentFoo”,
类型(Foo),
类型(FoodHandler),
新属性元数据(OnCurrentFooChanged));
当前FooChanged时的私有静态无效(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
FooHolder=(FooHolder)d.Property.Owner;//类似于这样的内容:(您必须自己定义unwrefoo()和WireFoo())

当前FooChanged时的私有静态void(DependencyObject d、DependencyPropertyChangedEventArgs e) {
FooHolder=(FooHolder)d;//正在更改的属性的所有者是回调方法的
d
参数

基于@catalin dicu的回答,我将这个helper方法添加到了我的库中。将OnChanged方法设置为非静态并隐藏所有转换,感觉更自然一些

static class WpfUtils
{
    public static DependencyProperty RegisterDependencyPropertyWithCallback<TObject, TProperty>(string propertyName, Func<TObject, Action<TProperty, TProperty>> getOnChanged)
        where TObject : DependencyObject
    {
        return DependencyProperty.Register(
            propertyName,
            typeof(TProperty),
            typeof(TObject),
            new PropertyMetadata(new PropertyChangedCallback((d, e) =>
                getOnChanged((TObject)d)((TProperty)e.OldValue, (TProperty)e.NewValue)
            ))
        );
    }
}
静态类WpfUtils
{
public static dependencProperty RegisterDependencyPropertyWithCallback(字符串propertyName,Func getOnChanged)
where-TObject:DependencyObject
{
返回DependencyProperty.Register(
propertyName,
类型(t属性),
类型(TObject),
新PropertyMetadata(新PropertyChangedCallback((d,e)=>
getOnChanged((TObject)d)((TProperty)e.OldValue,(TProperty)e.NewValue)
))
);
}
}
用法示例:

class FooHolder
{
    public static DependencyProperty CurrentFooProperty = WpfUtils.RegisterDependencyPropertyWithCallback
        <FooHolder, Foo>("CurrentFoo", x => x.OnCurrentFooChanged);

    private void OnCurrentFooChanged(Foo oldFoo, Foo newFoo)
    {
        // do stuff with holder
    }
}
class FooHolder
{
public static dependencProperty CurrentFooProperty=WpfUtils.RegisterDependencyPropertyWithCallback
(“CurrentFoo”,x=>x.OnCurrentFooChanged);
当前foochanged时的私有void(Foo oldFoo,Foo newFoo)
{
//用支架做东西
}
}

在这里,我查看了d中的属性,可能是显而易见的。谢谢!1000感谢这一个…我刚刚进行了16个小时的航行,找到了显而易见的..MSDN文档似乎是由Humphrey Appleby爵士编写的。。
class FooHolder
{
    public static DependencyProperty CurrentFooProperty = WpfUtils.RegisterDependencyPropertyWithCallback
        <FooHolder, Foo>("CurrentFoo", x => x.OnCurrentFooChanged);

    private void OnCurrentFooChanged(Foo oldFoo, Foo newFoo)
    {
        // do stuff with holder
    }
}