3

ボタンのコマンドバインディングが更新されないという奇妙な問題があります...

ユーザーが医療システムのリストを維持できるようにする、MvvmLight で作成されたアプリがあります。これらのシステムはテンプレートから構築されます (つまり、テンプレートは 2 台のカメラ、1 台のフレームグラバーなど、およびこれらの各パーツに含まれる必要がある詳細を指定する場合があります)。テンプレートが変更された場合、新しいテンプレートを使用するようにシステムをアップグレードできます。システム ウィンドウとテンプレート ウィンドウはどちらもモードレスなので、システムを見ながらテンプレートを変更できます。テンプレート ウィンドウ ビュー モデルは、テンプレートが更新された場合にメッセージを送信するため、開いているシステム ウィンドウはそれに応じて反応します。

システム ビューは、システムをアップグレードする必要があるときにユーザーに警告するために使用される Border を保持します。境界線の可視性は、システムのリビジョン番号を基になるテンプレートの最新のリビジョン番号と比較するシステム エンティティの bool プロパティにバインドされます。最新のテンプレート リビジョンを使用している場合は、[表示] が [折りたたみ] に設定されているため、コンテンツは表示されません。

システムが古いリビジョンを使用している場合、Border が表示され、コンテンツにはアップグレードの必要性を知らせるメッセージと、アップグレードを実行するボタンが含まれます。この境界線とボタンには 3 つのシナリオがあります...

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>

含まれているのは「return true;」だけなので、CanExecute メソッドを表示しても意味がありません。この時点で!

境界線の可視性とボタンの有効状態の間で奇妙な相互作用が起こっているように見え、これが CanExecute メソッドの結果をオーバーライドしているようです。

誰でもアイデアはありますか?ここで重要なことを追加するのを忘れていたら、お気軽にお尋ねください。前もって感謝します。

4

1 に答える 1