WPF 按钮命令绑定(bind)已刷新,但按钮仍处于禁用状态

标签 wpf button mvvm command canexecute

我有一个按钮的命令绑定(bind)没有更新的奇怪问题...

我有一个用 MvvmLight 编写的应用程序,允许用户维护医疗系统列表。这些系统是根据模板构建的(即一个模板可能指定两个摄像头、一个图像采集卡等,以及关于这些部分应包含的内容的详细信息)。如果修改了模板,则可以升级系统以使用新模板。系统窗口和模板窗口都是无模式的,因此可以在查看系统时修改模板。如果模板更新,模板窗口 View 模型会发出一条消息,以便任何打开的系统窗口都可以做出相应的 react 。

系统 View 包含一个 Border,用于在用户需要升级系统时警告用户。边框的可见性绑定(bind)到系统实体上的 bool 属性,该属性将系统的修订号与基础模板的最新修订号进行比较。如果他们使用最新的模板修订版,则可见性设置为折叠,因此他们看不到内容。

如果系统使用旧版本,边框是可见的,内容包含一条消息,通知他们需要升级,以及进行升级的按钮。我有三种使用此边框和按钮的场景...

1) 如果系统在打开窗口时使用了过时的版本,则显示边框,并且按钮可见。如果修改了模板,消息会正确更新以显示新号码,并且按钮仍然可见。这是正确的。

2) 如果系统打开时使用的是最新的模板版本,那么当模板修改时,边框显示正确,消息更新正确,按钮启用。同样,这是正确的,只要我之后关闭系统窗口即可。

3) 但是,如果我点击更新按钮,然后在系统升级并且隐藏边框后,我再次更新模板,然后当边框重新显示时,按钮被禁用。我尝试从 CanExecute 方法中删除所有逻辑并只返回 true,因此应该启用该按钮,但事实并非如此。我必须关闭系统窗口并重新打开它才能启用该按钮。

我尝试向 View 模型添加一个事件,每当模板更新时我都会引发该事件。我在 View 中捕获了这个事件并手动刷新了按钮的命令绑定(bind)。但是,这并没有导致再次调用 CanExecute 方法,按钮仍然处于禁用状态。

我意识到这有点令人困惑,并且在不了解全部内容的情况下很难进行调试,但我希望有人能够给我一些线索。如果有帮助,这里是相关代码...

首先,边框、消息和按钮的 XAML...

<Border Visibility="{Binding Converter={StaticResource BoolToVisibilityVC}, Path=NotUsingLatestDhrTemplate, ConverterParameter=true}"
        HorizontalAlignment="Stretch"
        Margin="3"
        Grid.Row="3"
        BorderBrush="Red"
        BorderThickness="2"
        Background="#FFFFEBEB">
  <Grid Margin="3"
        gridHelper:GridHelper.GridRows="*,Auto">
    <WrapPanel>
      <TextBlock Text="This PCR uses template revision "
                  VerticalAlignment="Center" />
      <TextBlock Text="{Binding TemplateRevisionForThisDhr}"
                  VerticalAlignment="Center" />
      <TextBlock Text=", but the current template revision is "
                  VerticalAlignment="Center" />
      <TextBlock Text="{Binding LatestTemplateRevisionForThisPartDefinitionType}"
                  VerticalAlignment="Center" />
      <telerik:RadButton Name="UpdateDhrButton"
                          Click="UpdateDhrButton_OnClick"
                          Command="{Binding Path=DataContext.UpdateDhrCommand, ElementName=DhrViewX}"
                          Margin="0,0,10,0"
                          HorizontalAlignment="Right"
                          VerticalAlignment="Stretch"
                          IsEnabledChanged="UpdateDhrButton_IsEnabledChanged">
        <StackPanel Orientation="Horizontal"
                    Margin="1">
          <Image Margin="0,0,3,0"
                  Width="16"
                  Height="16"
                  Source="/Images;component/Images/battery.png" />
          <TextBlock>Update PCR</TextBlock>
        </StackPanel>
      </telerik:RadButton>
    </WrapPanel>
  </Grid>
</Border>

显示 CanExecute 方法没有任何意义,因为它只包含“return true”;此刻!

看起来好像在边框的可见性和按钮的启用状态之间发生了一些奇怪的交互,并且这似乎覆盖了 CanExecute 方法的结果。

有人有什么想法吗?请随时询问我是否忘记在此处添加任何重要内容。提前致谢。

最佳答案

虽然我不是 100% 确定问题出在哪里,但我很确定我知道,所以我会发布它以防它对其他人有帮助。

问题似乎只在按钮在某个时候被禁用后才会出现。似乎只要我在命令上有一个 CanExecute 方法,那么即使它总是返回 true,按钮在绑定(bind)过程中仍然会暂时禁用。如果在包含该按钮的边框控件将其 Visibility 设置为 Collapsed 时发生这种情况,则无论 CanExecute 方法返回什么,该按钮都不会启用。

我通过删除 CanExecute 方法来解决这个问题,并在我不希望它被点击时隐藏按钮。然后,每次边框可见时,我手动将按钮的 IsEnabled 属性设置为 true。

这在这个特定场景中有效,因为按钮的使用是基于权限的,所以如果不允许他们点击它,最好不要让他们看到它。不过,在其他情况下它仍然会导致问题,我不确定您将如何解决它。

希望这对某人有帮助。

关于WPF 按钮命令绑定(bind)已刷新,但按钮仍处于禁用状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16901927/

相关文章:

wpf - 将旋转的 ArcSegment 增长为完整的圆

css - 一侧倾斜的div

wpf - NHibernate的可共混性/MVVM

c# - 如何在不在 wpf 中引入新引用的情况下从 View 模型 (.cs) 调用窗口 (.xaml.cs) 中的方法

c# - 基于其他控件的 Gotfocus 显示控件的文本

.net - 如何在 WPF RichTextBox 中设置标签大小

c# - 神秘号码18888888888888888

c# - 为什么 RelayCommand RaiseCanExecuteChanged 在单元测试中不起作用?

android - 按钮如何获得焦点?

html - 在 HTML <button> 标签中定位