我需要一个自定义控件,例如ListBox,但是具有检查对象逻辑(可以检查对象,可以绑定到CheckedObjects集合,可以将检查模式从“单个”切换到“多个”)。我从将依赖项属性和RoutedEvents添加到从ListBoxItem(CheckedListboxItem)和ListBox(CheckedListBox)继承的控件中开始,但是我不知道如何使我的CheckedListBox使用CheckedListBoxItem而不是ListBoxItem。是的,我了解模板,但是我无法在我的业务对象中实现IsChecked属性。
更新。代码:
public partial class CheckedListBox : ListBox
{
public CheckedListBox()
{
InitializeComponent();
}
public static readonly DependencyProperty CheckedItemsProperty;
public static readonly RoutedEvent CheckedChangedEvent;
public static readonly RoutedEvent ItemCheckedEvent;
public static readonly RoutedEvent ItemUnCheckedEvent;
static CheckedListBox()
{
CheckedItemsProperty = DependencyProperty.Register("CheckedItems", typeof(IList), typeof(CheckedListBox), new FrameworkPropertyMetadata(new ArrayList(), new PropertyChangedCallback(OnCheckedItemsChanged)));
CheckedChangedEvent = EventManager.RegisterRoutedEvent("CheckedChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler<bool>), typeof(CheckedListBoxItem));
EventManager.RegisterClassHandler(typeof(CheckedListBox), CheckedListBoxItem.CheckedEvent,
new RoutedEventHandler(checkedEventHandler));
EventManager.RegisterClassHandler(typeof(CheckedListBox), CheckedListBoxItem.UnCheckedEvent,
new RoutedEventHandler(unCheckedEventHandler));
}
private static void checkedEventHandler(object sender, RoutedEventArgs e)
{
var checkedListBox = (CheckedListBox)sender;
var item = (CheckedListBoxItem)e.OriginalSource;
var collection = checkedListBox.CheckedItems;
collection.Add(item.Content);
}
private static void unCheckedEventHandler(object sender, RoutedEventArgs e)
{
var checkedListBox = (CheckedListBox)sender;
var item = (CheckedListBoxItem)e.OriginalSource;
var collection = checkedListBox.CheckedItems;
collection.Remove(item.Content);
}
public static event DependencyPropertyChangedEventHandler CheckedItemsChanged;
public event RoutedEventHandler ItemChecked
{
add { AddHandler(ItemCheckedEvent, value); }
remove { RemoveHandler(ItemCheckedEvent, value); }
}
public event RoutedEventHandler ItemUnChecked
{
add { AddHandler(ItemUnCheckedEvent, value); }
remove { RemoveHandler(ItemUnCheckedEvent, value); }
}
public IList CheckedItems
{
get { return (IList)GetValue(CheckedItemsProperty); }
set { SetValue(CheckedItemsProperty, value); }
}
private static void OnCheckedItemsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var checkedListBox = (CheckedListBox)sender;
var args = new RoutedPropertyChangedEventArgs<IList>((IList)e.OldValue, (IList)e.NewValue);
args.RoutedEvent = CheckedListBox.CheckedChangedEvent;
checkedListBox.RaiseEvent(args);
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return (item is CheckedListBoxItem);
}
protected override DependencyObject GetContainerForItemOverride()
{
return new CheckedListBoxItem();
}
}
public class CheckedListBoxItem : ListBoxItem
{
public static DependencyProperty IsCheckedProperty;
public static readonly RoutedEvent CheckChangedEvent;
public static readonly RoutedEvent CheckedEvent;
public static readonly RoutedEvent UnCheckedEvent;
public bool IsChecked
{
get { return (bool)GetValue(IsCheckedProperty); }
set { SetValue(IsCheckedProperty, value); }
}
public event RoutedPropertyChangedEventHandler<bool> CheckChanged
{
add { AddHandler(CheckChangedEvent, value); }
remove { RemoveHandler(CheckChangedEvent, value); }
}
static CheckedListBoxItem()
{
IsCheckedProperty = DependencyProperty.Register("IsChecked", typeof(bool), typeof(CheckedListBoxItem), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnCheckChanged)));
CheckChangedEvent = EventManager.RegisterRoutedEvent("CheckChanged", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler<bool>), typeof(CheckedListBoxItem));
CheckedEvent = EventManager.RegisterRoutedEvent("Checked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(CheckedListBoxItem));
UnCheckedEvent = EventManager.RegisterRoutedEvent("UnChecked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(CheckedListBoxItem));
}
private static void OnCheckChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var checkedListBoxItem = (CheckedListBoxItem)sender;
var oldValue = (bool)e.OldValue;
var newValue = (bool)e.NewValue;
if ((bool)e.NewValue && !(bool)e.OldValue)
{
var argch = new RoutedEventArgs(CheckedListBoxItem.CheckedEvent);
checkedListBoxItem.RaiseEvent(argch);
}
else if (!(bool)e.NewValue && (bool)e.OldValue)
{
var argun = new RoutedEventArgs(CheckedListBoxItem.UnCheckedEvent);
checkedListBoxItem.RaiseEvent(argun);
}
var args = new RoutedPropertyChangedEventArgs<bool>(oldValue, newValue);
args.RoutedEvent = CheckedListBoxItem.CheckChangedEvent;
checkedListBoxItem.RaiseEvent(args);
}
}
为了使CheckBoxList使用CheckBoxListItem,您应该考虑重写方法GetContainerForItemOverride()。看看这个:
public class ForceDirectedItemsControl : ItemsControl
{
protected override bool IsItemItsOwnContainerOverride(object item)
{
return (item is ForceDirectedItem);
}
protected override DependencyObject GetContainerForItemOverride()
{
return new ForceDirectedItem();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句