【发布时间】: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
-
我尽可能多地添加。我希望它有所帮助。
-
我认为这一行 -
<Binding Path="CurrentAccessList" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Expander}}" />在输出窗口中给你一个绑定错误。是这样吗?
标签: c# wpf checkbox scroll listbox