[英]How to pass ContentControl Element to CommandParameter?
我有一個工具欄,顯示帶有Image
和TextBlock
許多Button
。
然后,我創建一個CommandManager來管理所有Button
的命令。 因此,我想實現一個工廠來通過Button
的TextBlock
分配動作。
這是我的xaml和Command函數,我嘗試傳遞所有Button
的Text
,但是我不知道該怎么做。
<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>
ActionManager:
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
屬性設置為string
並傳遞此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>
我會這樣做的:
<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>
您可以使用以下標記擴展:
https://www.codeproject.com/Articles/456589/Bindable-Converter-Parameter
它允許您將命令參數綁定到xaml屬性。 因此,例如,您可以在按鈕的標記字段中放入一些標識符,然后使用擴展名將其綁定到命令參數。 這樣,您只使用一個命令,只使用一個綁定,就可以在命令處理程序中獲得區分按鈕的全部功能。
希望能幫助到你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.