如何将ItemsMouseDown绑定到ItemsControl中的FormattedText

时间:2014-08-24 04:05:14

标签: wpf xaml mvvm itemscontrol

在使用MVVM的WPF中,我希望在单击鼠标时将视图模型中的属性设置为显示的文本。那就是我希望ItemsControl中的PreviewMouseDown事件在viewmodel中设置一个属性。

在下面的XAML中,我使用ItemsControl来显示FormattedText ObservableCollection中的字符串。一切顺利,下面的XAML显示FormattedText。

但是,如何将PreviewMouseDown绑定到视图模型的每个生成项?

我在ItemsControl中使用DataTemplate的所有尝试最终都会导致:

System.Windows.Data错误:26:对于ItemsControl的容器类型的项目,将忽略ItemTemplate和ItemTemplateSelector;

XAML

<ItemsControl 
         ItemsSource="{Binding Strings}" >
        <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Canvas 
                             Background="Transparent"
                             Width="{x:Static h:Constants.widthCanvas}" 
                             Height="{x:Static h:Constants.heightCanvas}" 
                             />
                    </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
</ItemsControl>

添加

 h:MouseBehaviour.PreviewMouseDownCommand="{Binding PreviewMouseDown}"

到Canvas定义永远不会导致调用该命令,我无法将其添加到DataTemplate中。

感谢任何帮助或更好的想法。

1 个答案:

答案 0 :(得分:1)

作为ItemsControl中的项目托管在ContentPresenter中,因此如果您将命令绑定到相同的项目,它将应用于ItemsControl中的项目

因此,为此目的,我们可以在ItemsControl或任何父容器的资源中使用通用Style for ContentPresenter

例如

    <Style TargetType="ContentPresenter">
        <Setter Property="h:MouseBehaviour.PreviewMouseDownCommand"
                Value="{Binding PreviewMouseDown}" />
    </Style>

上面的示例是基于PreviewMouseDown命令在每个项目的视图模型中的假设,如果命令在父视图模型中,那么您可能使用

    <Style TargetType="ContentPresenter">
        <Setter Property="h:MouseBehaviour.PreviewMouseDownCommand"
                Value="{Binding PreviewMouseDown, RelativeSource={RelativeSource FindAncestor,AncestorType=ItemsControl}}" />
    </Style>