2017-08-03 69 views
0

我有ListBox中的CheckBox列表,並且ListBox可以滾動,但是每次我在ListBox中向上或向下移動以查看其他CheckBox時Checked事件觸發。有什麼辦法可以預防它嗎?我只是希望在IsChecked發生變化時觸發該事件!在ListBox中滾動時,防止CheckBox中的onchecked事件

<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類的列表,並描述作爲財產。這是簡單的:

lbPermission.ItemsSource = PermissionList; 

它的工作原理這種方式,還有就是我把它放在DataTemplate中創造的複選框,然後的CheckBox與檢查用轉換器的項目列表(與CurrentAccessList )如果該特定項目被檢查或沒有。 CurrentAccessList是來自DataBase的列表。

CurrentAccessList有一個bool屬性。

謝謝。

+0

沒有足夠的代碼來重現問題。請更新問題。 – Yevgeniy

+0

你想要我添加什麼? – Amir

+0

您用作DataContext和EnumConverter實現的類。你也可以解釋爲什麼你需要將一個名爲CurrentAccessList的東西從擴展器傳遞給轉換器?我想幫助你,但首先我需要重現問題。所以我需要[最小,完整和可驗證的示例](https://stackoverflow.com/help/mcve) – Yevgeniy

回答

1

由於虛擬化,您會遇到問題。 爲了避免這種行爲,你可以添加:

ScrollViewer.CanContentScroll="False" 

你的列表框。

但是真正的問題在於你的Enum轉換器。 虛擬化強制轉換器在滾動時執行。 由於某種原因,它返回不同的值。 這就是爲什麼處理程序被調用。