如何在ControlTemplate项上附加触发器

本文关键字:触发器 ControlTemplate | 更新日期: 2023-09-27 18:29:54

我们正在尝试在使用RadMessageBox控件时加载的Stackpanel上绑定Trigger。示例:

 <!-- CustomMessageBox Template -->
        <ControlTemplate x:Key="MessageBoxTemplate" TargetType="messageBox:RadMessageBoxControl">
            <Border Padding="12" Background="{StaticResource PhoneChromeBrush}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <ContentControl x:Name="PART_Title" Grid.Row="0"
                                HorizontalContentAlignment="Left"
                                FontSize="{StaticResource PhoneFontSizeLarge}"
                                FontFamily="{StaticResource PhoneFontFamilySemiBold}"
                                Margin="{StaticResource PhoneMargin}"/>
                    <ContentControl HorizontalContentAlignment="Left" Grid.Row="1"
                                    VerticalContentAlignment="Top" Margin="{StaticResource PhoneMargin}"
                                    x:Name="PART_Message"/>
                    <CheckBox x:Name="PART_CheckBox" Grid.Row="2"
                          HorizontalAlignment="Left"
                          VerticalAlignment="Bottom"/>
                    <ContentControl x:Name="PART_ButtonsContainer" Grid.Row="3"
                                HorizontalContentAlignment="Stretch" Margin="12,0" Width="440">
                        <ContentControl.ContentTemplate>
                            <DataTemplate>
                                <StackPanel x:Name="PART_ButtonsPanel"
                                        Orientation="Vertical" HorizontalAlignment="Stretch">
                                        <i:Interaction.Triggers>
                                            <i:EventTrigger EventName="Loaded">
                                            <i:InvokeCommandAction Command="{Binding DataContext.CustomMessageBoxStackPanelLoadedCommand}" CommandParameter="{Binding PART_ButtonsPanel}"/>
                                            </i:EventTrigger>
                                        </i:Interaction.Triggers>
                                </StackPanel>
                            </DataTemplate>
                        </ContentControl.ContentTemplate>
                    </ContentControl>
                </Grid>
            </Border>
        </ControlTemplate>

ControlTemplate在Page.Resources中。我们无法触发堆叠面板加载的事件。代码隐藏文件:

private bool _CustomMessageBoxStackPanelLoadedCommandCanExecute = true;
    bool CustomMessageBoxStackPanelLoadedCommandCanExecute
    {
        get
        {
            return _CustomMessageBoxStackPanelLoadedCommandCanExecute;
        }
        set
        {
            if (_CustomMessageBoxStackPanelLoadedCommandCanExecute == value)
            {
                return;
            }
            _CustomMessageBoxStackPanelLoadedCommandCanExecute = value;
            RaisePropertyChanged("CustomMessageBoxStackPanelLoadedCommandCanExecute");
            if (_CustomMessageBoxStackPanelLoadedCommand != null)
                _CustomMessageBoxStackPanelLoadedCommand.RaiseCanExecuteChanged();
        }
    }
    private RelayCommand<string> _CustomMessageBoxStackPanelLoadedCommand;
    public ICommand CustomMessageBoxStackPanelLoadedCommand
    {
        get
        {
            if (_CustomMessageBoxStackPanelLoadedCommand == null)
            {
                _CustomMessageBoxStackPanelLoadedCommand = new RelayCommand<string>(CustomMessageBoxStackPanelLoaded, (data) => CustomMessageBoxStackPanelLoadedCommandCanExecute);
            }
            return _CustomMessageBoxStackPanelLoadedCommand;
        }
    }
    private void CustomMessageBoxStackPanelLoaded(object obj)
    {
        System.Diagnostics.Debug.WriteLine("Hello");
    }

如何在ControlTemplate项上附加触发器

问题出在CommandBinding上。您的绑定是:

 Command="{Binding DataContext.CustomMessageBoxStackPanelLoadedCommand}"

这意味着在控件的DataContext类中,有任何对象名DataContext的属性为CustomMessageBoxStackPanelLoadedCommand。但事实并非如此。RelativeSource绑定中使用了这种类型的语法。

但这里更改您的绑定为:

Command="{Binding CustomMessageBoxStackPanelLoadedCommand}"

所以绑定引擎现在将直接在DataContext中找到这个命令。(我希望为您的观点提供数据上下文没有任何问题。)

也不确定你为什么写

CommandParameter="{Binding PART_ButtonsPanel}"

像这样。你想在那里做什么?