1

ボタンを含むテンプレート列を持つ Silverlight のデータグリッドがあります。XAMLでは基本的にこのように見えます-

<sdk:DataGrid ItemsSource="{Binding Items}" SelectedItem="{Binding Selected, Mode=TwoWay}">
            <sdk:DataGrid.Columns>
                <sdk:DataGridTemplateColumn>
                    <sdk:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button HorizontalAlignment="Right" Click="btn_Click">
                                <StackPanel Orientation="Horizontal">
                                    <Image Source="/image.png"/>
                                </StackPanel>
                            </Button>
                        </DataTemplate>
                    </sdk:DataGridTemplateColumn.CellTemplate>
                </sdk:DataGridTemplateColumn>
                <!-- Ten Other Columns -->
            </sdk:DataGrid.Columns>
        </sdk:DataGrid>

さて、このセットアップでは、そのボタンがクリックされるたびに btn_Click イベントが正常に発生します (行が選択されているかどうかに関係なく)。selectionchanged イベントをデータグリッドに追加するまではすべて問題ありません。XAML の最初の行は次のようになりました -

<sdk:DataGrid ItemsSource="{Binding Items}" SelectedItem="{Binding Selected, Mode=TwoWay}" SelectionChanged="dg_SelectionChanged">

現在、btn_Click イベントは、クリックされたボタンが現在選択されている行にある場合にのみ発生します。それ以外の場合、selectionchanged イベントのみが発生し、ボタンのクリックには至りません。あなたは明らかに選択された行を切り替えているので、selectionchangedイベントの発火は理解しています。しかし、私が理解していないのは、btn_Click がヒットしない理由です。これがなぜなのか、それを回避する方法について誰か考えがありますか?

前もって感謝します。

4

2 に答える 2

1

btn_Clickおよびdg_SelectionChangedイベントハンドラーにブレークポイントを設定したため、Button.Clickイベントが発生しないと思ったかもしれません。この場合、デバッガーはdg_SelectionChangedに入り、btn_Clickには入りません。ただし、ビューにTextBlockを追加して、次のようなものを追加すると、次のようになります。

        private void btn_Click(object sender, RoutedEventArgs e)
        {
            textBlock.Text += "Button.Click ";
        }

        private void dg_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            textBlock.Text += "DataGrid.SelectionChanged ";
        }

どちらのイベントも問題なく発生していることがわかります。

于 2011-04-11T17:21:03.687 に答える
0

問題が何であるかがわかりました。このグリッドをラップする Silverlight ツールキットのビジー インジケーターがありました (レイアウト グリッドも含まれています)。SelectionChanged イベントで、ビジー インジケーターの IsBusy プロパティを true に切り替えました。どうやらこれにより、そのビジー インジケーターの下で発生したすべてのイベントがキャンセルされます (私の btn_Click を含む) イベント。したがって、私の質問に答えるために: SelectionChanged はイベントを強制終了しませんでした。btn_Click を強制終了した selectionchanged イベント内からビジー インジケーターを呼び出していました。

于 2011-04-13T12:39:36.837 に答える