【问题标题】:Can a command binding act on a targeted UIElement attribute other than IsEnabled?命令绑定能否作用于 IsEnabled 以外的目标 UIElement 属性?
【发布时间】:2013-10-19 23:45:24
【问题描述】:

我喜欢将按钮的 Command 属性绑定到 ICommand 对象如何处理 Click 事件和启用/禁用状态。有没有什么办法,使用我自己的命令/CommandBinding 类/MarkerExtension/附加的自定义 DependencyProperty/(其他),该命令绑定也会影响其他目标属性?

例如,我使用自己的派生命令,该命令具有 Visible 布尔属性。绑定按钮的 Command 属性后,我希望命令对象的 Visible 属性作用于按钮的可见性,就像 CanExecute 方法作用于 IsEnabled 属性一样(无需绑定按钮的 IsEnabled 属性)。

有没有办法实现这样的目标?

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    对于按钮上的其他依赖属性(如 Visibility),您应该将其绑定到 ViewModel 类中的属性(因为您标记了 MVVM),该属性应实现 INotifyPropertyChanged 接口。然后您可以操作 ViewModel 类上的属性来影响按钮的可见性。这里有什么不能通过普通绑定解决的吗?

    【讨论】:

    • 我知道我可以将 Visibility 属性绑定到我想要的任何东西。我只是发现在绑定特殊类型的命令时能够同时控制 IsEnabled 和 Visibility 属性更方便。必须一遍又一遍地绑定两个属性以获得相同的期望行为会适得其反并且容易出错;我当然想尽可能避免两件事。
    【解决方案2】:

    是的,它可以。可以将具有自定义逻辑和一些关于 wpf hacking 知识的自定义命令放置在 Button 上,并且可以用于其他事情,而不仅仅是在启用和禁用状态之间切换。

    同时,不,它不能。命令用于用户输入,因此为什么在 Button.Clicked 上触发命令是有意义的,但在 wpf 世界中附加命令只是为了更改可见性并没有多大意义。如果您希望更改可见性,wpf 为您提供简单的绑定而不是命令。无论如何,改变可见性并不是真正的用户输入。仅在用户输入上使用命令,其他一切都使用绑定。

    进一步阅读 X.j 的帖子,它向您解释了如何在 Button.Visibility 属性上正确使用绑定。

    【讨论】:

    • 有没有这样的黑客的例子你可以参考我?我似乎找不到任何东西。
    • 没有人真正破解这个。这就是为什么你不能在网上找到它。我建议你不要破解并看看 X.J.回答。您的问题是命令绑定可以作用于 IsEnabled 以外的目标 UIElement 属性吗?我告诉你是的,它可以,但它不是 wpf 通常的面包。虽然这里是如何。将 ICommandSource 类型的依赖属性附加到要破解的控件。
    • 你可以试试看。附加 ICommand 或 ICommandSource 类型的属性。当您在附加属性更改事件中时,您可以将自定义逻辑添加到您将属性附加到的控件中。
    • 我明白你的意思,这实际上是我的第一个想法,甚至在问之前。我只是希望有比拥有第二个 Command 属性更好的解决方案。貌似没有。
    • 你最终会在 XAML 中得到类似的东西: 如您所见,您在我的例子中创建了一个自定义 FrameworkElement,我将其命名为 CommandExtender,可以在 xaml 中使用,它在内部存储了一个 UIElement。当 Button.Visibility 更改时,您执行 AnotherCommand。当 Button.Clicked 按钮自己的 Command 被触发时。基本上你包装一个 ANY UIElement 并用另一个命令扩展它。 :) 我建议你发布一个关于这个的新问题。
    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多