【问题标题】:Prevent a onchecked event in CheckBox while scrolling it in ListBox在 ListBox 中滚动时防止 CheckBox 中的 onchecked 事件
【发布时间】:2020-01-07 18:37:53
【问题描述】:

我在 ListBox 中有一个 CheckBox 列表,并且 ListBox 可以滚动,但是每次我在 ListBox 中向上或向下移动以查看其他 CheckBox 时,都会触发 Checked 事件。有什么办法可以预防吗?我只是希望在 IsChecked 更改时触发该事件!

<ListBox Margin="0,5,0,0" Grid.Column="1" Background="Transparent" 
             ScrollViewer.HorizontalScrollBarVisibility="Disabled"
             ScrollViewer.VerticalScrollBarVisibility="Visible" 
             SelectionMode="Single" Name="lbPermission" BorderThickness="0"
             HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <CheckBox IsEnabled="{Binding Path=IsEditable, Mode=OneWay, 
                    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}}" 
                              Validation.ErrorTemplate="{x:Null}" Content="{Binding Id}" 
                              Checked="CheckedHandler" Unchecked="CheckedHandler" >
                        <CheckBox.IsChecked>
                            <MultiBinding Converter="{StaticResource EnumConverter}" 
                                           Mode="OneWay">
                                <Binding Path="Id" />
                                <Binding Path="CurrentAccessList" 
                                         RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Expander}}" />
                            </MultiBinding>
                        </CheckBox.IsChecked>
                    </CheckBox>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

我试图让它与 TowWay 或使用 PropertyChanged 一起工作,但没有。

这是活动的代码:

private void CheckedHandler(object sender, RoutedEventArgs e)
    {
        RaiseEvent(new RoutedEventArgs(OnDataModifiedEvent));
    }

这是转换器的代码:

public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
    {
        try
        {
            // The second value in the MultiBinding should be LaborAccountAccessList
            if ((value[1] as List<LaborAccountAccessList>) != null)
            {
                if (((IList)value[1]).Count > 0)
                    return (((List<LaborAccountAccessList>)value[1]).FirstOrDefault(x => x.PermissionId == value[0].ToString().ToLower()) != null) ?
                        !((List<LaborAccountAccessList>)value[1]).FirstOrDefault(x => x.PermissionId == value[0].ToString().ToLower()).IsObselete : false;
            }
            return false;
        }
        catch (Exception e)
        {
            ErrorLibrary.Instance.ErrorQueueContext.PrintError(String.Format("Unable bind the data to checkbox. Error={0}", e.ToString()));
            return false;
        }
    }

DataContex 只是一个具有 Id 和 Description 作为属性的类的列表。很简单:

lbPermission.ItemsSource = PermissionList;

它的工作原理是,有一个项目列表,我将它放在 DataTemplate 中以创建这些复选框,然后使用转换器检查(使用 CurrentAccessList)检查该特定项目是否已检查。 CurrentAccessList 是一个来自数据库的列表。

CurrentAccessList 有一个 bool 属性。

谢谢。

【问题讨论】:

  • 没有足够的代码来重现该问题。请更新问题。
  • 你要我补充什么?
  • 您用作 DataContext 的类和 EnumConverter 实现。您还可以解释为什么需要将名为 CurrentAccessList 的东西从扩展器传递给转换器吗?我想帮助你,但首先我需要重现这个问题。所以我需要Minimal, Complete, and Verifiable example
  • 我尽可能多地添加。我希望它有所帮助。
  • 我认为这一行 - &lt;Binding Path="CurrentAccessList" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Expander}}" /&gt; 在输出窗口中给你一个绑定错误。是这样吗?

标签: c# wpf checkbox scroll listbox


【解决方案1】:

由于虚拟化,您遇到了问题。 为了避免这种行为,您可以添加:

ScrollViewer.CanContentScroll="False" 

到您的列表框。

但真正的问题在于您的 Enum 转换器。 当您滚动时,虚拟化会强制转换器执行。 由于某种原因,它返回不同的值。 这就是调用 handler 的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多