WPF命令绑定样式中的ItemsControl

时间:2018-06-11 07:48:14

标签: wpf xaml command styles

我在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”的文本块上设置命令绑定?

我已经看过自定义命令但不知何故它们无法正常工作。

1 个答案:

答案 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)
    {
    }