我有一个奇怪的问题,按钮的Command绑定没有被更新......
我有一个用MvvmLight编写的应用程序,它允许用户维护医疗系统列表。这些系统是根据模板构建的(即模板可能指定两个摄像头,一个帧抓取器等等,以及每个部件应包含的内容的详细信息)。如果修改了模板,则可以升级系统以使用新模板。系统窗口和模板窗口都是无模式的,因此可以在查看系统时修改模板。模板窗口视图模型会在模板更新时发出消息,以便任何打开的系统窗口都能做出相应的反应。
系统视图包含一个Border,用于在用户需要升级系统时发出警告。边界的可见性绑定到系统实体上的bool属性,该属性将系统的修订号与基础模板的最新修订号进行比较。如果它们位于最新的模板修订版上,则“可见性”设置为“折叠”,因此它们看不到内容。
如果系统使用较旧的版本,则边框可见,并且内容包含一条消息,通知他们需要升级,以及执行升级的按钮。这个边框和按钮我有三个场景......
1)如果系统在打开窗口时使用了过时的修订版,则会显示边框,并且按钮可见。如果修改了模板,则消息会正确更新以显示新编号,并且该按钮仍然可见。这是正确的。
2)如果系统在打开时使用最新的模板修订版,那么修改模板时,边框会正确显示,消息会正确更新,并且按钮已启用。再次,这是正确的,只要我之后关闭系统窗口。
3)但是,如果单击更新按钮,则在系统升级并隐藏边框后,我再次更新模板,然后重新显示边框时,按钮被禁用。我尝试从CanExecute方法中删除所有逻辑并返回true,因此应该启用该按钮,但事实并非如此。我必须关闭系统窗口并重新打开它以启用按钮。
我尝试向视图模型添加一个事件,每当模板更新时我都会提出这个事件。我在视图中捕获了此事件,并手动刷新了按钮的命令绑定。但是,这不会导致再次调用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方法的结果。
任何想法?如果我忘记在这里添加任何重要内容,请随时询问。提前谢谢。
答案 0 :(得分:2)
好吧,虽然我不能100%确定问题是什么,但我很确定我知道,所以会发布它,以防它帮助其他人。
在某些时候禁用按钮后,似乎只会出现此问题。似乎只要我在命令上有一个CanExecute方法,那么即使这总是返回true,在绑定过程中仍然会暂时禁用该按钮。如果包含该按钮的边框控件的Visibility设置为Collapsed,则无论CanExecute方法返回什么,都不会启用该按钮。
我通过删除CanExecute方法解决了这个问题,并在我不想点击它时隐藏了按钮。然后,每次使边框可见时,我手动将按钮的IsEnabled属性设置为true。
在这个特定场景中有效,因为按钮的使用是基于权限的,所以如果不允许他们点击它,那么不让他们看到它就行了。但它仍然会在其他情况下引起问题,而且我不确定你会如何解决它。
希望这有助于某人。