0

我有以下内容:

    <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,btnYYY 与 YYY 类似。

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

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

4

2 回答 2

1

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

于 2012-05-21T07:28:19.613 回答
1

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

假设您的 Model 实例仅具有自我意识:当正在执行时才CanDoXXX为假。您可以拥有一个包含模型集合的 ViewModel 类,每个模型都有其单独的状态。现在,您只需要在 VM 中放置一个属性,例如,它将遍历所有模型并检查它们中的任何一个是否正在工作(,表示)。最后绑定XXXCanExecuteAnyCanDoXXXCanDoYYY

<Button IsEnabled={Binding CanExecuteAny} />

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

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

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

于 2012-05-21T12:54:51.537 回答