【问题标题】:Using Delegates In XAML在 XAML 中使用委托
【发布时间】:2017-10-20 01:36:41
【问题描述】:

在元素上使用事件时,我只需将 EventHandler 的名称写为字符串即可:<Button Click="OnButtonClick" ..>。更好的是,Visual Studio 会检查代码隐藏中是否真的存在这样的 EventHandler。 (这可能是 ReSharper 的一个功能,我不确定)

如何对添加到元素的 Func 执行相同的操作? (我不考虑使用转换器,因为我认为它需要运行时反射,这会减慢速度。我正在寻找像 EventHandler 这样的设计时解决方案)

我想要一个返回 Func 的 viewmodel 属性,并且我希望 XAML 将其视为事件处理程序,或类似的等价物。

【问题讨论】:

  • 我做C#才十年,WPF才五年;你能帮我理解什么是“我添加到元素中的函数”吗?你是如何添加它的?
  • 一个包含 Func 类型属性的类(它实际上可以是任何类型的委托)。简而言之,我的目标是具有返回类型的处理程序。
  • 您不能直接将委托绑定到 XAML 属性 - 您必须将其包装在方法中(这就是事件处理程序)或使用带有 TypeConverter 的 {Binding } 来转换 @ 987654323@ 到 MethodInfo (IIRC - 虽然我不确定这是否真的有效)。理想情况下,您应该使用Command="{Binding }" 而不是Click,但这是另一个讨论)。
  • 顺便说一句,XAML 中的所有内容都使用运行时反射。不要担心调用 click 事件 的开销,除非您预计用户每秒点击数千次。你不能开箱即用地做你想做的事;你需要一个命令或附加的行为。那么,这是视图还是视图模型的属性?
  • @EdPlunkett 我也不想失去 EventHandlers 在 XAML 中的设计时检查。

标签: c# wpf xaml xamarin.forms resharper


【解决方案1】:

这可以通过 DependencyProperty 来完成。

示例:

class MyCoolButton : Button
{
    public Func<int, int> MyFunc
    {
        get { return (Func<int, int>)GetValue(MyFuncProperty); }
        set { SetValue(MyFuncProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MyFunc.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MyFuncProperty =
        DependencyProperty.Register("MyFunc", typeof(Func<int, int>), typeof(MyCoolButton), new PropertyMetadata(null));
}

您可以在 XAML 中设置它:

<controls:MyCoolButton MyFunc="DoSomething" />

在你后面的代码中:

private int DoSomething(int foo)
{
    return foo++;
}

从酷炫的按钮调用函数非常简单

if (MyFunc != null)
{
    MyFunc(value);
}

【讨论】:

    【解决方案2】:

    我不太明白你的问题。但如果你想要像 Button 那样的 EventHandler,只需使用 public event EventHandler Clicked;

    public class CustomButton : Button
    {
        public CustomButton()
        {
        }
    
        public event EventHandler Tapped;
    }
    

    我确实建议您使用绑定方法,而不是代码隐藏。

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多