如何将ContentControl元素传递给CommandParameter?

时间:2017-05-19 02:55:06

标签: c# wpf mvvm commandparameter

我有一个工具栏,显示许多Button ImageTextBlock

然后,我创建一个CommandManager来管理所有Button的命令。所以,我想实现一个工厂来分配Button的{​​{1}}。

这是我的xaml和Command函数,我尝试传递所有TextBlock的{​​{1}},但我不知道该怎么办。

Button

ActionManager:

Text

3 个答案:

答案 0 :(得分:1)

Button没有“文字”概念,但您可以将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>

答案 1 :(得分:0)

我会这样做的:

<Button Tag="AnyUniqueString">

并将命令绑​​定到它

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

所以你没有链接到文本按钮(你可以翻译它) - 但要注意一个命令,你将无法管理刷新和can_execute将启用/禁用你的按钮。将每个按钮绑定到单独的命令可能并不那么复杂......?

我在我的解决方案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>

答案 2 :(得分:0)

您可以使用此标记扩展程序:

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

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

希望有所帮助