暂时禁用通过依赖项属性启用的按钮

时间:2012-05-20 19:59:35

标签: wpf button dependency-properties

我有以下内容:

    <Button Content="Do XXX" Height="23" Name="btnXXX"
                  IsEnabled="{Binding Path=(Model:INameOfInterface.CanDoXXX)}" />
    <Button Content="Do YYY" Height="23" Name="btnYYY"
                  IsEnabled="{Binding Path=(Model:INameOfInterface.CanDoYYY)}" />

非常好地工作,根据界面是否可以执行XXX,启用或禁用btnXXX,对于YYY,类似于btnYYY。

但是,要为每次单击强制执行一个操作,我想在单击其中一个按钮时禁用所有按钮,即暂时覆盖依赖项并禁用按钮,然后,一旦执行了操作,重新建立依赖项条件

所以我的问题是:我如何暂时禁用所有按钮然后恢复依赖

2 个答案:

答案 0 :(得分:1)

您可以创建bool属性并将所有按钮IsEnable绑定到它。每当你做一些动作时,将其设为假,并在完成动作后使其成为真,这反过来将影响所有按钮。或者你可以使用微调器/忙指示器。

答案 1 :(得分:1)

通常,您不“覆盖并恢复依赖项属性”,而是设计Model / ViewModel,以便绑定的属性封装所有必需的状态。在你的情况下,这意味着你的Model:INameOfInterface.CanDoXXX最初应该是真的,并且每当执行任何按钮动作时都是假的(xxx,yyy,...)。因此,CanDoXXX必须了解YYY的执行情况。将它们混合在你的模型中可能是一个坏主意,这就是ViewModel发挥作用的地方。

假设您的模型实例仅具有自我意识:CanDoXXX如果正在执行XXX则为 。您可以拥有一个包含模型集合的ViewModel类,每个模型都有其独立的状态。现在,您只需要在VM中放置一个属性,例如CanExecuteAny将迭代所有模型,并检查它们中是否有任何模型正在工作(CanDoXXXCanDoYYY表明这一点。最后绑定

<Button IsEnabled={Binding CanExecuteAny} />

这只是潜在的解决方案之一,最好的解决方案取决于数据的确切结构。以下是其他一些想法:

  • 您可以将所有按钮放在面板中并禁用面板而不是单个按钮。
  • 实现ICommand接口并将按钮的Command属性绑定到它。见RelayCommand概念。就个人而言,我会去追求它。
  • 由于您的按钮需要信息是否已经点击了任何其他按钮,您可能会发现所有模型都可以访问某种全局状态(完全依赖注入;不完美的单例而无DI)很有用。

话虽如此,基本的想法是在您可以绑定的单个属性中包含所有需要的信息。交换DP并不是一种真正的设计方式。 Binding已经存在更新内容,因此多次设置它会重复相同的作业两次。