如何将 ContentControl 元素传递给 CommandParameter?
How to pass ContentControl Element to CommandParameter?
我有一个工具栏显示许多 Button
和 Image
和 TextBlock
。
然后,我创建了一个 CommandManager 来管理所有 Button
的命令。所以,我想实现一个工厂来分配 Button
的 TextBlock
的动作。
这是我的xaml和命令功能,我尝试通过所有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>
动作管理器:
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>
我有一个工具栏显示许多 Button
和 Image
和 TextBlock
。
然后,我创建了一个 CommandManager 来管理所有 Button
的命令。所以,我想实现一个工厂来分配 Button
的 TextBlock
的动作。
这是我的xaml和命令功能,我尝试通过所有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>
动作管理器:
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>