iv'e得到了几个itemscontrol,我需要为它们附加一个事件处理程序仅当满足特定条件时,预览鼠标左键按下事件。
iv'e为我的控件设计了一个带有数据触发器的样式,我检查了它的绑定,并使用BorderThickness属性的常规属性setter进行了尝试,只是为了看看数据触发器是否有效.(确实如此..)
当使用事件设置器满足datatrigger的条件时,如何像使用常规属性设置器一样应用datatriggers来附加事件处理程序?
类似的东西
<Style TargetType="{x:Type ItemsControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding Turn}" Value="True">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ItemsControl_MouseLeftButtonDown"></EventSetter>
</DataTrigger>
</Style.Triggers>
</Style>
该标记在eventsetter行上引发以下异常:
'Set property 'System.Windows.EventSetter.Event' threw an exception.'
内部异常:
{"Value cannot be null.rnParameter name: value"}
不幸的是,根据MSDN文档中的备注:
请注意,只有Style.Setters支持EventSetter对象。触发器(TriggerBase和派生类)不支持EventSetter
在这种情况下,DataTrigger是从TriggerBase派生的,因此您不能使用它来动态设置事件处理程序。我现在能想到的一个解决方法可能是根据Turn
的值动态切换样式。
您可以使用StyleSelector
public sealed class NewItemPlaceholderStyleSelector : StyleSelector
{
public Style? Style { get; set; }
public override Style? SelectStyle(object? item, DependencyObject container)
{
if (NewItemPlaceholder.IsMatch(item))
{
return this.Style;
}
return base.SelectStyle(item, container);
}
}
<DataGrid ...>
<DataGrid.ItemContainerStyleSelector>
<local:NewItemPlaceholderStyleSelector>
<local:NewItemPlaceholderStyleSelector.Style>
<Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource {x:Type DataGridRow}}">
<EventSetter Event="MouseDoubleClick" Handler="OnMouseDoubleClick" />
</Style>
</local:NewItemPlaceholderStyleSelector.Style>
</local:NewItemPlaceholderStyleSelector>
</DataGrid.ItemContainerStyleSelector>