静态方法/函数到 Func T 的绑定XAML 中的属性 [英] Binding of static method/function to Func<T> property in XAML

查看:16
本文介绍了静态方法/函数到 Func T 的绑定XAML 中的属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 XAML 创建对象树,其中一个节点如下所示:

I'm working on using XAML to create an object tree and one of the nodes looks like this:

public class ExecuteMethod : INode
{
    #region Implementation of INode

    public bool Evaluate()
    {
        return Function != null && Function();
    }

    public string Name { get; set; }

    private string _type;
    public string Type
    {
        get
        {
            if (string.IsNullOrEmpty(_type))
            {
                _type = GetType().Name;
            }

            return _type;
        }
    }


    #endregion

    public Func<bool> Function { get; set; }

}

我的目标是使 XAML 和背后的代码尽可能干净,而现在我为每个函数创建包装器属性的情况并非如此:

My goal is essential to make the XAML and code behind as clean as possible which isn't the case right now where I'm creating wrapper properties for every function:

public static Func<bool> Func1 { get { return Method1; } }

public static bool Method1()
{
    //Do stuff here
    return true;
}

对于上述代码,xaml 如下所示:

and the xaml looks like this for the above code:

<Root 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="clr-namespace:XamlBT;assembly=XamlBT"  
xmlns:d="clr-namespace:TestBT;assembly=TestBT">
<Root.Child>
    <Sequence Name="sequence1" >
        <ExecuteMethod Name="e1.1" Function="{x:Static d:Program.Func1}" />
        <Selector Name="selector1" >
            <ExecuteMethod Name="e2.1" Function="{x:Static d:Program.Func1}"  />
        </Selector>
    </Sequence>
</Root.Child>

我想知道是否有一种快速简便的方法将方法/函数绑定到 Func 属性,我在这里谈论的是方法,而不是执行的方法/函数的值.(我可以考虑在 valueConverter 或 ExecuteMethod 节点/类中使用一些反射魔法,但这只是感觉肮脏和奇怪)我希望 XAML 的外观示例:

I would like to know if there's a quick and easy way to bind methods/functions to the Func property, I'm talking about the method here NOT the value of the executed method/function. (I can think of using some reflection magic in a valueConverter or inside the ExecuteMethod node/class but that just feels dirty and weird) An example of how I'd like the XAML to look:

<Root 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="clr-namespace:XamlBT;assembly=XamlBT"  
xmlns:d="clr-namespace:TestBT;assembly=TestBT">
<Root.Child>
    <Sequence Name="sequence1" >
        <ExecuteMethod Name="e1.1" Function="{x:Static d:Program.Method1}" />
        <Selector Name="selector1" >
            <ExecuteMethod Name="e2.1" Function="{x:Static d:Program.Method1}"  />
        </Selector>
    </Sequence>
</Root.Child>

提前感谢您的帮助,抱歉英语语法不好,这不是我的母语:)

Thanks for any help in advance and sorry for the bad English grammar, it's not my native language :)

推荐答案

我可以想到几种方法来使它看起来更简洁,但是没有针对您所要求的绑定语法.我猜你最满意的是 写你的自己的标记扩展,所以你可以让它看起来像{d:StaticMethod Program.Method1},但你肯定必须使用反射,但缓存会很简单,看起来会更好而不是价值转换器.

I can think of couple ways to make it look cleaner but there isn't a binding syntax for what you are asking. I'm guessing what you would be most happy with would be writing your own markup extension so you could make it look like {d:StaticMethod Program.Method1}, but you would definitely have to use reflection, but it would be trivial to cache and would look better than a value converter.

这篇关于静态方法/函数到 Func T 的绑定XAML 中的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆