У меня визуально-подобный эффект, но за некоторыми элементами есть фактические данные модели.Элементы могут быть перемещены пользователем.
Я использую contentcontrol на холсте, в котором моделями представления элементов являются места в контенте, которые затем могут отображаться по-разному в зависимости от их типа, но с использованием одного и того же contentcontrol.Простое связывание представления с различными свойствами в модели представления.Однако мне нужно сохранить позицию в модели, и я не могу найти связывающее решение.
1) Команда Application.Save обрабатывается в модели основного представления, поэтому у меня нет доступа к представлениютам.Это означает, что я должен сохранить данные позиции, когда элементы перемещены, или есть лучший подход?
2) Предполагая, что я прав с 1), я стараюсь избегать кода позади, то есть я нехотите, чтобы contentcontrol имел дело с элементами, которые они имеют в своем контенте.Однако, пока код версии - это все, что я мог придумать:
Мой код, лежащий в основе решения, пока:
Все элементы модели реализуют интерфейс:
public interface IViewElement
{
String Position { get; set; }
}
И в контенте управления:
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>