如何使用XAML绑定到WPF中的父位置更改,并且后面没有代码

时间:2011-03-23 10:23:30

标签: wpf xaml binding canvas position

我有一个类似visio的interfact,但在一些元素后面有实际的模型数据。用户可以移动元素。

我在画布上使用contentcontrol,其中元素的视图模型是内容中的位置,然后可以根据其类型以不同的方式显示,但使用相同的contentcontrol。将视图绑定到viewmodel中的不同属性很简单。但是,我必须保存模型中的位置,我找不到绑定解决方案。

1)Application.Save命令在主视图模型中处理,因此我无法访问该视图。这意味着我必须在移动元素时保存位置数据,或者是否有更好的方法?

2)假设我对1)是正确的,我希望避免代码落后,即我不希望contentcontrol处理他们内容中的元素。但是,到目前为止,版本背后的代码是我能想到的:

到目前为止我的解决方案背后的代码:

所有模型元素都实现了一个接口:

public interface IViewElement
{
    String Position { get; set; }
}

在contentcontrol中:

 void ContentControl_LayoutUpdated(object sender, EventArgs e)
    {
        IViewElement content = this.Content as IViewElement;
        content.Position = new Point(Diagram.GetLeft(this), Diagram.GetTop(this)).ToString();
    }

XAML:

<Style TargetType="{x:Type diagram:Item}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type diagram:Item}">
                <Grid Canvas.Top="{Binding ElementName=PART_ContentPresenter, Path=Content.Position, Mode=TwoWay}" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"
                    ContextMenu="{x:Null}">
                    <!-- PART_ContentPresenter -->
                    <ContentPresenter x:Name="PART_ContentPresenter"
                        Content="{TemplateBinding Content}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

<DataTemplate DataType="{x:Type local:ViewModel}">
<StackPanel>
    ...
</StackPanel>

2 个答案:

答案 0 :(得分:1)

只需封装您在行为中使用的代码隐藏

答案 1 :(得分:1)

为什么使用字符串存储位置?使用Point或两个十进制值,然后使用双向绑定将ContentControl的Canvas.TopCanvas.Left位置绑定到这些值。

当顶部和左侧位置发生变化时,它会自动更新模型。

修改 这是一个例子:

<ContentControl Canvas.Top="{Binding ContentModel.Top, Mode=TwoWay}"
                Canvas.Left="{Binding ContentModel.Left, Mode=TwoWay}"
                Content="{Binding ContentModel}" />