是否可以仅为用户交互处理WPF中的SelectionChanged事件?

时间:2013-01-13 06:38:34

标签: wpf user-interaction selectionchanged

我想在WPF DataGrid元素中处理SelectionChanged事件,仅用于用户交互/选择,如果是由于绑定或其他设置值,则跳过。知道我将如何确定选择是否被用户交互更改?或者任何可以执行类似任务的替代事件?

3 个答案:

答案 0 :(得分:13)

也许尝试将SelectionChanged事件与PreviewMouseDown事件结合起来。当用户单击一行时,您设置了一些属性,并在SelectionChanged事件处理程序中检查属性是否已更改。

示例代码XAML:

<DataGrid SelectionChanged="OnSelectionChanged" PreviewMouseDown="OnPreviewMouseDown">
        <!--some code-->          
</DataGrid>

代码背后:

bool isUserInteraction;

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (isUserInteraction)
    {
        //some code

        isUserInteraction = false;
    }
}

private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    isUserInteraction = true;
}

答案 1 :(得分:0)

嗨,你可以在xaml中使用它:

 <ComboBox x:Name="ComboBoxName" SelectionChanged="ComboBox_SelectionChanged">
                                        <ComboBox.Style>
                                            <Style TargetType="ComboBox">
                                                <Style.Triggers>                                                       
                                                    <Trigger Property="IsDropDownOpen" Value="True">
                                                        <Setter Property="IsEditable" Value="True"></Setter>
                                                    </Trigger>
                                                </Style.Triggers>
                                            </Style>
                                        </ComboBox.Style>
                                    </ComboBox>

并在代码背后:

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (!((ComboBox)sender).IsEditable) return;
        //Do Stuff;
    }

答案 2 :(得分:0)

另一种方法是处理ComboBox的DropDownOpenedDropDownClosed事件。这比Rafal接受的答案稍微好一些,因为如果用户点击ComboBox然后点击其他地方导致ComboBox关闭而没有做出选择,它会阻止布尔标志卡住为真。但它没有解决的问题是,如果ComboBox具有键盘焦点,并且用户点击向上和向下箭头来更改选择。

private void Event_ComboBox_DropDownOpened(object sender, EventArgs e)
{
    isUserInteraction = true;
}

private void Event_ComboBox_DropDownClosed(object sender, EventArgs e)
{
    isUserInteraction = false;
}

private void Event_ComboBox_SelectedChanged(object sender, SelectionChangedEventArgs e)
{
    if (isUserInteraction)
    {
        // Do work
    }
}