我在Textboxstyles.xaml
中有一个风格如下
<Style x:Key="EmptyItemsControlUsabilityDashboard2017Style" TargetType="ItemsControl">
<Style.Triggers>
<Trigger Property="HasItems" Value="false">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Control">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Image Height="12" Width="12" Source="/YoLo;component/Resources/Images/link.png" Margin="0,3,0,0" />
<TextBlock x:Name="EmptyCollectionTextBox" Text="{x:Static UsabilityDashboard2017Loc:DashboardUsability2017Resource.lblNumNotDefined}"
Style="{StaticResource UsabilityDashboard2017TextBoxStyle}"
HorizontalAlignment="Center"
Margin="5,25,0,25"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
我已经在另一个 Xaml 文件中使用它,如下所示
<ItemsControl ItemsSource="{Binding YoLoViewModelsCollection}" Name="YoLoViewModelsItemSource" Style="{StaticResource EmptyItemsControlUsabilityDashboard2017Style}">
现在它显示一个文本框,表明此集合为空,但是如何在用户用户单击它执行命令的样式内名为"EmptyCollectionTextBox"的文本块上设置命令绑定?
我已经看到了自定义命令,但不知何故它们不起作用。
这段代码实际上有很多问题。首先,我不知道该触发器应该做什么,看起来只有在列表中没有元素时才会设置控件模板?
其次,看起来您正在尝试使用图像和文本来表示集合中的每个元素,所有这些都在 ItemsControl 中。不是通过模板化整个控件来执行此操作,而是通过模板化 ItemTemplate 来实现的。并且您使用数据模板,而不是控件模板:
现在回到您的实际问题,您希望在单击文本块时收到通知。有许多不同的方法可以执行此操作,但对于这种情况,您也可以将该文本块替换为按钮,然后使用将其表示为文本块的控件模板覆盖模板。这为您提供了两全其美的优势:从 GUI 的角度来看,它实际上仍然是一个 TextBlock,但您仍然可以获得所有按钮单击通知和命令处理程序等:
<Image />
<Button Command="{Binding ClickedCommand}" Cursor="Hand">
<Button.Template>
<ControlTemplate>
<TextBlock Text="Text Binding Goes Here" />
</ControlTemplate>
</Button.Template>
</Button>
此特定示例假定集合中的项具有名为"ClickedCommand"的命令处理程序。实际上,您的处理程序可能驻留在父类中(例如主窗口的视图模型(,在这种情况下,您需要为主窗口指定一个 x:Name(例如"_this"(并绑定到该窗口,将项作为 CommandParameter 传入,以便它知道单击了哪个
:<Button Command="{Binding ElementName=_this, Path=DataContext.ClickedCommand}" CommandParameter="{Binding}" Cursor="Hand">
然后,您的主视图模型有一个处理程序,如下所示:
public ICommand ClickedCommand { get { return new RelayCommand<YourCollectionItemType>(OnClicked); } }
private void OnClicked(YourCollectionItemType item)
{
}