Как связать изменения родительской позиции в WPF с использованием XAML и без кода - PullRequest
0 голосов
/ 23 марта 2011

У меня визуально-подобный эффект, но за некоторыми элементами есть фактические данные модели.Элементы могут быть перемещены пользователем.

Я использую 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>

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Почему вы используете строку для хранения позиции? Используйте либо Point, либо два десятичных значения, а затем привяжите позиции Canvas.Top и Canvas.Left вашего ContentControl к этим значениям с помощью двустороннего связывания.

Он автоматически обновит модель при изменении положения сверху и слева.

Edit: Вот пример:

<ContentControl Canvas.Top="{Binding ContentModel.Top, Mode=TwoWay}"
                Canvas.Left="{Binding ContentModel.Left, Mode=TwoWay}"
                Content="{Binding ContentModel}" />
1 голос
/ 23 марта 2011

Просто инкапсулируйте код, который вы использовали в поведении

...