WPF中的SelectionChanged事件能否仅为用户交互而处理?

xtupzzrd  于 2022-12-19  发布在  其他
关注(0)|答案(4)|浏览(175)

我希望仅为用户交互/选择处理WPF DataGrid元素中的SelectionChanged事件,如果是由于绑定或其他设置值,则跳过该事件。您知道我将如何确定用户交互是否更改了选择吗?或者知道将执行类似任务的任何备用事件?

hs1ihplo

hs1ihplo1#

也许可以尝试将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;
}
1qczuiv0

1qczuiv02#

hi你可以在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;
    }
7d7tgy0s

7d7tgy0s3#

另一种方法是处理ComboBox的DropDownOpenedDropDownClosed事件。这比Rafal接受的答案稍好一些,因为如果用户单击ComboBox,然后单击其他地方,导致ComboBox在没有进行选择的情况下关闭,它可以防止布尔标志被固定为true。但是,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
    }
}
6yjfywim

6yjfywim4#

根据回复中的@luka和评论中的@Jens.Huehn_at_SlideFab.com,这是我找到的最好的解决方案(不会阻塞标签按钮,也不会改变控件的外观,或者其他怪癖):

<ComboBox SelectionChanged="ComboBox_SelectionChanged"
    ItemsSource="{Binding ...}" SelectedItem="{Binding ...}">
    <ComboBox.Style>
        <Style TargetType="ComboBox">
            <Setter Property="IsTextSearchEnabled" Value="False"/>
            <Style.Triggers>
                <Trigger Property="IsDropDownOpen" Value="True">
                    <Setter Property="IsTextSearchEnabled" Value="True"/>
                </Trigger>
                <Trigger Property="IsKeyboardFocused" Value="True">
                    <Setter Property="IsTextSearchEnabled" Value="True"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ComboBox.Style>
</ComboBox>

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

相关问题