如何将 ContentControl 元素传递给 CommandParameter?

How to pass ContentControl Element to CommandParameter?

我有一个工具栏显示许多 ButtonImageTextBlock

然后,我创建了一个 CommandManager 来管理所有 Button 的命令。所以,我想实现一个工厂来分配 ButtonTextBlock 的动作。

这是我的xaml和命令功能,我尝试通过所有ButtonText,但我不知道该怎么做。

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Command" Value="{Binding ActionCommand}"/>
            <Setter Property="CommandParameter" Value="{Binding Path=Text}"/>
        </Style>
    </StackPanel.Resources>
    <Button>
        <StackPanel>
            <Image Source="/Resources/ToolBar/open.png"/>
            <TextBlock Text="Open"/>
        </StackPanel>
    </Button>
    <Button>
        <StackPanel>
            <Image Source="/Resources/ToolBar/save.png"/>
            <TextBlock Text="Save"/>
        </StackPanel>
    </Button>
</StackPanel>

动作管理器:

public ICommand ActionCommand { get { return new RelayCommand(_onActionCommand); } }

private void _onActionCommand(object parameter)
{
    if (parameter == null)
    {
        return;
    }

    string buttonContent = parameter as string;
    switch (buttonContent)
    {
        case "Open":
            new OpenWindow().ShowDialog();
            break;
        case "Open":
            new Save();
            break;
    }
}

我会这样做的:

<Button Tag="AnyUniqueString">

并将命令绑​​定到它

<Setter Property="CommandParameter" Value="{Binding Path=Tag}"/>

所以您没有链接到文本按钮(您可以翻译它)- 但请注意,对于所有命令,您将难以管理刷新,can_execute enable/disable 你的按钮。将每个按钮绑定到单独的命令也许不是那么复杂...?

我在我的解决方案中这样使用它CBR

<StackPanel Margin="10,0,10,0" Orientation="Vertical">
                <Button Style="{DynamicResource CbrStandardButton}" Margin="2,10,2,10"
                        Command="{Binding ForwardCommand}" CommandParameter="CatalogNewCommand" >
                    <DockPanel Margin="10">
                        <Image Source="/CBR;component/Resources/Images/32x32/library_new.png" Width="32"></Image>
                        <Label Style="{DynamicResource CbrLabel}"
                               Content="{LocalizationExtension ResModul=CBR, Key=HomeView.LblActionNew, DefaultValue=Start a new library}" />
                    </DockPanel>
                </Button>
                <Button Style="{DynamicResource CbrStandardButton}" Margin="2,10,2,10"
                        Command="{Binding ForwardCommand}" CommandParameter="BookOpenCommand" >
                    <DockPanel Margin="10">
                        <Image Source="/CBR;component/Resources/Images/32x32/book/book_read.png" Width="32"></Image>
                        <Label Style="{DynamicResource CbrLabel}"
                               Content="{LocalizationExtension ResModul=CBR, Key=HomeView.LblActionRead, DefaultValue=Read a book}" />
                    </DockPanel>
                </Button>
                <Button Style="{DynamicResource CbrStandardButton}" Margin="2,10,2,10"
                        Command="{Binding ForwardCommand}" CommandParameter="SysHelpCommand">
                    <DockPanel Margin="10">
                        <Image Source="/CBR;component/Resources/Images/32x32/book_type/book_type_xps.png" Width="32"></Image>
                        <Label Style="{DynamicResource CbrLabel}"
                               Content ="{LocalizationExtension ResModul=CBR, Key=HomeView.LblActionTutorial, DefaultValue=Quick start tutorial}" />
                    </DockPanel>
                </Button>
            </StackPanel>

您可以使用此标记扩展:

https://www.codeproject.com/Articles/456589/Bindable-Converter-Parameter

它允许您将命令参数绑定到 xaml 属性。因此,例如,您可以在按钮的标签字段中放置一些标识符,并使用扩展将其绑定到命令参数。这样一来,您只需使用一个命令,一个绑定,就可以在命令处理程序中获得区分按钮所需的一切。

希望对您有所帮助

A Button 没有 "Text" 的概念,但您可以将 Tag 属性 设置为 string 并传递这个:

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Command" Value="{Binding ActionCommand}"/>
            <Setter Property="CommandParameter" Value="{Binding Path=Tag, RelativeSource={RelativeSource Self}}"/>
        </Style>
    </StackPanel.Resources>
    <Button Tag="Open">
        <StackPanel>
            <Image Source="/Resources/ToolBar/open.png"/>
            <TextBlock Text="Open"/>
        </StackPanel>
    </Button>
    <Button Tag="Save">
        <StackPanel>
            <Image Source="/Resources/ToolBar/save.png"/>
            <TextBlock Text="Save"/>
        </StackPanel>
    </Button>
</StackPanel>