具有从ListBox wpf继承的选中对象逻辑的自定义控件
我需要一个自定义控件,如ListBox,但具有选中对象逻辑(可以选中对象,可以绑定到CheckedObjects集合,可以将选中模式从“单个”切换到“多个”)。我开始向从ListBoxItem(CheckedListboxItem)和ListBox(CheckedListBox)继承的控件添加依赖项属性和RoutedEvents,但我不知道如何使我的CheckedListBox使用CheckedListboxItem而不是ListBoxItem。 是的,我知道模板,但我不能在我的业务对象中实现IsChecked属性。具有从ListBox wpf继承的选中对象逻辑的自定义控件,wpf,checkbox,listbox,controls,Wpf,Checkbox,Listbox,Controls,我需要一个自定义控件,如ListBox,但具有选中对象逻辑(可以选中对象,可以绑定到CheckedObjects集合,可以将选中模式从“单个”切换到“多个”)。我开始向从ListBoxItem(CheckedListboxItem)和ListBox(CheckedListBox)继承的控件添加依赖项属性和RoutedEvents,但我不知道如何使我的CheckedListBox使用CheckedListboxItem而不是ListBoxItem。 是的,我知道模板,但我不能在我的业务对象中实现I
upd。代码:
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);
}
}
公共部分类CheckedListBox:ListBox
{
公共CheckedListBox()
{
初始化组件();
}
公共静态只读从属属性CheckEditsProperty;
公共静态只读路由事件CheckedChangedEvent;
公共静态只读RoutedEvent ItemCheckedEvent;
公共静态只读RoutedEvent ItemUnCheckedEvent;
静态CheckedListBox()
{
CheckedItemsProperty=DependencyProperty.Register(“CheckedItems”、typeof(IList)、typeof(CheckedListBox)、new FrameworkPropertyMetadata(new ArrayList()、new PropertyChangedCallback(OnCheckedItemChanged));
CheckedChangedEvent=EventManager.RegisterRoutedEvent(“CheckedChanged”,RoutingStrategy.Bubble,typeof(RoutedPropertyChangedEventHandler),typeof(CheckedListBoxItem));
EventManager.RegisterClassHandler(typeof(CheckedListBox)、CheckedListBoxItem.CheckedEvent、,
新的路由EventHandler(选中EventHandler));
EventManager.RegisterClassHandler(typeof(CheckedListBox)、CheckedListBoxItem.UnCheckedEvent、,
新的路由登塔德勒(未选中登塔德勒);
}
私有静态void checkedEventHandler(对象发送方,RoutedEventTargs e)
{
var checkedListBox=(checkedListBox)发送方;
var item=(CheckedListBoxItem)e.OriginalSource;
var collection=checkedListBox.CheckedItems;
集合。添加(项。内容);
}
私有静态void取消选中Deventhandler(对象发送方,RoutedEventArgs e)
{
var checkedListBox=(checkedListBox)发送方;
var item=(CheckedListBoxItem)e.OriginalSource;
var collection=checkedListBox.CheckedItems;
集合。移除(项。内容);
}
公共静态事件依赖项PropertyChangedEventHandler CheckeditMschanged;
公共事件路由EventHandler ItemChecked
{
添加{AddHandler(ItemCheckedEvent,value);}
移除{RemoveHandler(ItemCheckedEvent,value);}
}
公共事件路由EventHandler项未选中
{
添加{AddHandler(ItemUnCheckedEvent,value);}
删除{RemoveHandler(ItemUnCheckedEvent,value);}
}
公共IList支票
{
获取{return(IList)GetValue(CheckedItemsProperty);}
set{SetValue(checkeditemsprroperty,value);}
}
私有静态void oncheckedItemChanged(DependencyObject发送方,DependencyPropertyChangedEventArgs e)
{
var checkedListBox=(checkedListBox)发送方;
var args=newRoutedPropertyChangedEventArgs((IList)e.OldValue,(IList)e.NewValue);
args.RouteEvent=CheckedListBox.CheckedChangedEvent;
选中ListBox.RaiseEvent(args);
}
受保护的覆盖布尔IsItemItsOwnContainerOverride(对象项)
{
返回(项目已选中ListBoxItem);
}
受保护的覆盖依赖对象GetContainerForItemOverride()
{
返回新的CheckedListBoxItem();
}
}
公共类CheckedListBoxItem:ListBoxItem
{
公共静态依赖性是被检查的属性;
公共静态只读路由事件CheckChangedEvent;
公共静态只读RoutedEvent CheckedEvent;
公共静态只读路由事件未选中;
公共场所被检查
{
获取{return(bool)GetValue(IsCheckedProperty);}
set{SetValue(IsCheckedProperty,value);}
}
公共事件RoutedPropertyChangedEventHandler CheckChanged
{
添加{AddHandler(CheckChangedEvent,value);}
删除{RemoveHandler(CheckChangedEvent,value);}
}
静态CheckedListBoxItem()
{
IsCheckedProperty=DependencyProperty.Register(“IsChecked”、typeof(bool)、typeof(CheckedListBoxItem)、new FrameworkPropertyMetadata(false、new PropertyChangedCallback(OnCheckChanged));
CheckChangedEvent=EventManager.RegisterRoutedEvent(“CheckChanged”,RoutingStrategy.Bubble,typeof(RoutedPropertyChangedEventHandler),typeof(CheckedListBoxItem));
CheckedEvent=EventManager.RegisterRoutedEvent(“选中”,RoutingStrategy.Bubble,typeof(RoutedEventHandler),typeof(CheckedListBoxItem));
UnCheckedEvent=EventManager.RegisterRouttedEvent(“UnChecked”,RoutingStrategy.Bubble,typeof(RoutedEventHandler),typeof(CheckedListBoxItem));
}
更改后的私有静态无效(DependencyObject发件人、DependencyPropertyChangedEventArgs e)
{
var checkedListBoxItem=(checkedListBoxItem)发送方;
var oldValue=(bool)e.oldValue;
var newValue=(bool)e.newValue;
if((bool)e.NewValue&!(bool)e.OldValue)
{
var argch=新路由EventArgs(CheckedListBoxItem.CheckedEvent);
checkedListBoxItem.RaiseEvent(argch);
}
else if(!(bool)e.NewValue&(bool)e.OldValue)
{
var argun=新路由EventArgs(选中ListBoxItem.UnCheckedEvent);
checkedListBoxItem.RaiseEvent(argun);
}
var args=新RoutedPropertyChangedEventArgs(旧值,新值);
args.RouteEvent=CheckedListBoxItem.CheckChangedEvent;
checkedListBoxItem.RaiseEvent(args);
}
}
<>代码> > p>为了使您的检查BOXLIST使用CHECKBOXISTITEM,您应该考虑重写GETCubEngReIfEfReIdEd()方法。看看这个:
public class ForceDirectedItemsControl : ItemsControl
{
protected override bool IsItemItsOwnContainerOverride(object item)
{
return (item is ForceDirectedItem);
}
protected override DependencyObject GetContainerForItemOverride()
{
return new ForceDirectedItem();
}
}
但我无法在我的业务对象中实现IsChecked属性。
-IsChecked(或IsSelected)应该是ViewModel关注点,而不是业务模型关注点。请看@HighCore,对不起,我是说当然是ViewModel。问题是这些物体