0

背景を色付けするために Rectangle で StaticResource コンバーターを使用し、同時に DataTemplate 内のその隣の別のコンポーネントで MouseDown ハンドラーを使用した瞬間に発生した、非常に奇妙なエラー ケースがあります。コードを少し絞り込むと、エラーを再現するために必要なものは次のとおりです。

上部にはこれらのリソースがあり、バインディングからブール値を取得して塗りつぶしの背景色に変換するコンバーターを指しています):

<Window.Resources>
 <vm:DesktopViewModel x:Key="DesktopVM" />
 <vm:BooleanToColorConverter x:Key="converter" />
</Window.Resources>

その後、同じ xaml ファイルで、これを使用して Alarm オブジェクトのリストを反復処理します (グリッド レイアウトを StackPanel に置き換え、コード サンプルを短くするために他のコンポーネントをいくつか削除しましたが、以下のコード スニペットはまだ失敗します)。

<ItemsControl ItemsSource="{Binding Alarms}">
 <ItemsControl.ItemTemplate>
   <DataTemplate>                                                        
    <StackPanel>
     <Rectangle Height="20" Stroke="Black" Width="20" RadiusX="4" RadiusY="4" Fill="{Binding Alarm, Converter={StaticResource converter}}"/>
     <Image Source="/MyNamespace;component/images/chart.png" Stretch="None" MouseDown="Image_MouseDown" Cursor="Hand"/>
    </StackPanel>
  </DataTemplate>
 </ItemsControl.ItemTemplate>
</ItemsControl>

画像の MouseDown ハンドラーを削除すると、最初に nullpointer エラーが発生することなく正常に実行されます。Rectangle の Fill タグを削除すると、コードは MouseDown ハンドラーで問題なく動作します!!! (そしてハンドラーも問題なく動作します)。Fill の StaticResource 参照が何かを台無しにして、マウス ハンドラー関数の検索に失敗しているようです?!?

実行中または何かをクリックしている間ではなく、ウィンドウが作成されたときに失敗することに注意してください。

編集: コンバーターを、コンバーターと同じことを行うトリガー付きの StaticResource を使用するスタイルに置き換えた場合、同じ nullpointer の問題が発生しました。属性の StaticResource 参照が原因であることは明らかですが、イベント リスナーに影響を与える理由がわかりません。

また、コンポーネントの順序も重要ではありません。Image を Rectangle の前に配置すると、エラーはまったく同じになります。

4

1 に答える 1

1

私の推測では、問題はコンバーター コードにあり、null 値を取得できることを考慮していないということです。

なぜ mouseDown の効果なのですか? おそらく、ViewModel がまだ作成されていない時点でイメージ要素のレンダリングが発生し、Fill プロパティの値が要求されます。

確実に述べるには情報が少なすぎますが、私の経験では、null 値を適切に処理しないコンバーターは WPF 開発の大きな問題になる可能性があります。設計時の多くの不安定性は、ヌル値を適切に処理しなかったコンバーターに根ざしていました。

于 2012-11-08T07:48:40.430 に答える