将adorner属性绑定到viewmodel属性

时间:2015-01-22 16:29:52

标签: wpf mvvm data-binding

我需要根据视图模型的属性显示(或不显示)装饰。

我的观点是这样的:

<ItemsControl x:Name="Items">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Canvas.Left" Value="{Binding Path=X}" />
            <Setter Property="Canvas.Top" Value="{Binding Path=Y}" />
            <Setter Property="Width" Value="{Binding Path=Width}" />
            <Setter Property="Height" Value="{Binding Path=Height}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <AdornerDecorator>
                <Border x:Name="DraggableBorder" Background="{Binding Path=BackgroundColor}">
                    <!-- contents -->

                    <i:Interaction.Behaviors>
                        <behaviors:DragOnCanvasBehavior DraggableItem="{Binding}">
                            <behaviors:DragOnCanvasBehavior.MouseOverAdornerTemplate>
                                <DataTemplate>
                                    <Border DataContext="DraggableBorder"
                                        BorderBrush="#B0000000"
                                        Width="{Binding Path=Width}"
                                        Height="{Binding Path=Height}" />
                                </DataTemplate>
                            </behaviors:DragOnCanvasBehavior.MouseOverAdornerTemplate>
                            <behaviors:DragOnCanvasBehavior.SelectedAdornerTemplate>
                                <DataTemplate>
                                    <Border DataContext="DraggableBorder"
                                        BorderBrush="#FF34619E"
                                        Width="{Binding Path=Width}"
                                        Height="{Binding Path=Height}"
                                        Visibility="{Binding Path=Selected,
                                            ElementName=DraggableBorder,
                                            Converter={StaticResource BooleanToVisibilityConverter}}" />
                                </DataTemplate>
                            </behaviors:DragOnCanvasBehavior.SelectedAdornerTemplate>
                        </behaviors:DragOnCanvasBehavior>
                    </i:Interaction.Behaviors>
                </Border>
            </AdornerDecorator>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

此行为将鼠标事件附加到正确的方法,并将鼠标显示/隐藏在装饰器上。

鼠标过度/自动事件和装饰工作正常,但选择装饰者会给我带来一些麻烦。因为只应选择一个项目,所以我希望依赖于viewmodel的Selected属性。我假设上面的示例中的内容可行(我尝试了几个版本),但唉,它不是。

我应该如何撰写我的Visibility财产?

此处提供完整代码:https://github.com/cosmo0/DragSnap/tree/adorners

1 个答案:

答案 0 :(得分:0)

可见性绑定与属性绑定&#39;已选择&#39; DraggableBorder,不存在。

此外,边框有一个DataContext =&#34; DraggableBorder&#34;在这种情况下,它是一个简单的字符串。

因此,请在边框上使用以下属性:

    <Border DataContext="{Binding DataContext, ElementName=DraggableBorder}" Visibility="{Binding Selected, Converter=...}"/>
相关问题