在ListBox中滚动CheckBox时阻止CheckBox中的onchecked事件

时间:2017-08-03 08:46:02

标签: c# wpf checkbox scroll listbox

我在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属性的类的List。它很简单:

lbPermission.ItemsSource = PermissionList;

它以这样的方式工作,有一个项目列表,我把它放在DataTemplate中创建那些CheckBoxes,然后CheckBoxes使用转换器检查(使用CurrentAccessList),如果该特定项目IsChecked或不。 CurrentAccessList是来自DataBase的列表。

CurrentAccessList有一个bool属性。

感谢。

1 个答案:

答案 0 :(得分:1)

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

ScrollViewer.CanContentScroll="False" 

到您的列表框。

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