TemplateBinding 作为 InvokeCommandAction CommandParameter 不起作用?
TemplateBinding as InvokeCommandAction CommandParameter not working?
我正在尝试为我想在 window 中多次使用的控件编写一个可重用的模板。在其中我有一些带有 CommandParameter 的命令。 CommandParameter 是我想通过此模板的“标签”属性 传递的对象。
对于“MenuItem”CommandParameter 和 StackPanel“DataContext”,这工作得很好。但是对于通过 InvokeCommandAction 的“MouseDown”事件(或“PreviewMouseDown”,我都试过了),我只得到一个 null 作为参数。它正在触发命令并调用正确的方法,但参数始终为空。
这里是我的Xaml(缩写):
<Window.Resources>
<ControlTemplate x:Key="FavControl" TargetType="ContentControl">
<StackPanel>
<StackPanel.ContextMenu>
<ContextMenu IsEnabled="{Binding FavContextMenuEnabled}">
<MenuItem Header="Bearbeiten"
Command="{Binding FavContextMenuEditCmd}"
CommandParameter="{TemplateBinding Tag}" />
<MenuItem Header="Löschen"
Command="{Binding FavContextMenuDeleteCmd}"
CommandParameter="{TemplateBinding Tag}" />
<Separator IsEnabled="{Binding UserisDev}" />
<MenuItem Header="Entwicklung"
Command="{Binding FavContextMenuStartDevCmd}"
CommandParameter="{TemplateBinding Tag}"
IsEnabled="{Binding UserisDev}" />
<MenuItem Header="Starte Objekt"
Command="{Binding FavContextMenuRunObjectCmd}"
CommandParameter="{TemplateBinding Tag}"
IsEnabled="{Binding UserisDev}" />
</ContextMenu>
</StackPanel.ContextMenu>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDown">
<i:InvokeCommandAction Command="{Binding FavoriteClickCmd}" CommandParameter="{TemplateBinding Tag}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<StackPanel Orientation="Vertical" DataContext="{TemplateBinding Tag}">
<Image Source="{Binding FavImage, UpdateSourceTrigger=PropertyChanged,Mode=OneWay}"
HorizontalAlignment="Center" VerticalAlignment="Center" Height="70" Width="70" />
<TextBlock Text="{Binding Description}" HorizontalAlignment="Center" />
</StackPanel>
</StackPanel>
</ControlTemplate>
</Window.Resources>
<!-- ... -->
<ContentControl Grid.Row="0" Grid.Column="0" Template="{StaticResource FavControl}" Tag="{Binding FavoriteArray[0]}" />
<ContentControl Grid.Row="0" Grid.Column="1" Template="{StaticResource FavControl}" Tag="{Binding FavoriteArray[1]}" />
<ContentControl Grid.Row="0" Grid.Column="2" Template="{StaticResource FavControl}" Tag="{Binding FavoriteArray[2]}" />
<!-- ... -->
我需要代码隐藏方法中的这个参数来知道要使用哪个对象。那么,我怎样才能传递这个对象呢?为什么 TemplateBinding 不起作用?谁能告诉我,我做错了什么?
P.S.: 抱歉错误,英语不是我的母语:)
而不是 TemplateBinding
,使用 RelativeSource
绑定到 TemplatedParent
。
<b:InvokeCommandAction Command="{Binding FavoriteClickCmd}"
CommandParameter="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}" />
我正在尝试为我想在 window 中多次使用的控件编写一个可重用的模板。在其中我有一些带有 CommandParameter 的命令。 CommandParameter 是我想通过此模板的“标签”属性 传递的对象。
对于“MenuItem”CommandParameter 和 StackPanel“DataContext”,这工作得很好。但是对于通过 InvokeCommandAction 的“MouseDown”事件(或“PreviewMouseDown”,我都试过了),我只得到一个 null 作为参数。它正在触发命令并调用正确的方法,但参数始终为空。
这里是我的Xaml(缩写):
<Window.Resources>
<ControlTemplate x:Key="FavControl" TargetType="ContentControl">
<StackPanel>
<StackPanel.ContextMenu>
<ContextMenu IsEnabled="{Binding FavContextMenuEnabled}">
<MenuItem Header="Bearbeiten"
Command="{Binding FavContextMenuEditCmd}"
CommandParameter="{TemplateBinding Tag}" />
<MenuItem Header="Löschen"
Command="{Binding FavContextMenuDeleteCmd}"
CommandParameter="{TemplateBinding Tag}" />
<Separator IsEnabled="{Binding UserisDev}" />
<MenuItem Header="Entwicklung"
Command="{Binding FavContextMenuStartDevCmd}"
CommandParameter="{TemplateBinding Tag}"
IsEnabled="{Binding UserisDev}" />
<MenuItem Header="Starte Objekt"
Command="{Binding FavContextMenuRunObjectCmd}"
CommandParameter="{TemplateBinding Tag}"
IsEnabled="{Binding UserisDev}" />
</ContextMenu>
</StackPanel.ContextMenu>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDown">
<i:InvokeCommandAction Command="{Binding FavoriteClickCmd}" CommandParameter="{TemplateBinding Tag}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<StackPanel Orientation="Vertical" DataContext="{TemplateBinding Tag}">
<Image Source="{Binding FavImage, UpdateSourceTrigger=PropertyChanged,Mode=OneWay}"
HorizontalAlignment="Center" VerticalAlignment="Center" Height="70" Width="70" />
<TextBlock Text="{Binding Description}" HorizontalAlignment="Center" />
</StackPanel>
</StackPanel>
</ControlTemplate>
</Window.Resources>
<!-- ... -->
<ContentControl Grid.Row="0" Grid.Column="0" Template="{StaticResource FavControl}" Tag="{Binding FavoriteArray[0]}" />
<ContentControl Grid.Row="0" Grid.Column="1" Template="{StaticResource FavControl}" Tag="{Binding FavoriteArray[1]}" />
<ContentControl Grid.Row="0" Grid.Column="2" Template="{StaticResource FavControl}" Tag="{Binding FavoriteArray[2]}" />
<!-- ... -->
我需要代码隐藏方法中的这个参数来知道要使用哪个对象。那么,我怎样才能传递这个对象呢?为什么 TemplateBinding 不起作用?谁能告诉我,我做错了什么?
P.S.: 抱歉错误,英语不是我的母语:)
而不是 TemplateBinding
,使用 RelativeSource
绑定到 TemplatedParent
。
<b:InvokeCommandAction Command="{Binding FavoriteClickCmd}"
CommandParameter="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}" />