我在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”的文本块上设置命令绑定?
我已经看过自定义命令但不知何故它们无法正常工作。
答案 0 :(得分:1)
这段代码实际上有很多错误。首先,我不知道该触发器应该做什么,看起来只有在列表中没有元素的情况下才会设置controltemplate?
其次,看起来你试图用图像和文本来表示集合中的每个元素,所有这些都在ItemsControl中。你不是通过模板化整个控件来做到这一点,你可以通过模板化ItemTemplate来实现。你使用的是DataTemplate,而不是ControlTemplate:
现在回到您的实际问题,只要单击TextBlock,您就需要通知。有许多不同的方法可以做到这一点,但是对于这种情况,您也可以用Button替换TextBlock,然后使用ControlTemplate覆盖模板,将其表示为TextBlock。这为您提供了两全其美的优势:从GUI的角度来看,它仍然是一个TextBlock,但您仍然可以获得所有按钮点击通知和命令处理程序等:
<Image />
<Button Command="{Binding ClickedCommand}" Cursor="Hand">
<Button.Template>
<ControlTemplate>
<TextBlock Text="Text Binding Goes Here" />
</ControlTemplate>
</Button.Template>
</Button>
此特定示例假定集合中的项目具有名为“ClickedCommand”的命令处理程序。实际上你的处理程序可能驻留在父类中(例如主窗口的视图模型),在这种情况下你需要给你的主窗口ax: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)
{
}