我有一个类似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>
答案 0 :(得分:1)
只需封装您在行为中使用的代码隐藏
答案 1 :(得分:1)
为什么使用字符串存储位置?使用Point或两个十进制值,然后使用双向绑定将ContentControl的Canvas.Top
和Canvas.Left
位置绑定到这些值。
当顶部和左侧位置发生变化时,它会自动更新模型。
修改强> 这是一个例子:
<ContentControl Canvas.Top="{Binding ContentModel.Top, Mode=TwoWay}"
Canvas.Left="{Binding ContentModel.Left, Mode=TwoWay}"
Content="{Binding ContentModel}" />