使用DataTrigger动态设置事件处理程序



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>

最新更新