Существует ли несоответствие между MVVM и возможностью изменить дерево Представления компонента?

Попробуйте использовать Row вместо Column

        Row(children: [
                Expanded(
                  child: TextField(
                    decoration: InputDecoration(hintText: "TextField 1"),
                  ),
                ),
                SizedBox(
                  width: 20,
                ),
                Expanded(
                  child: TextField(
                    decoration: InputDecoration(hintText: "TextField 2"),
                  ),
                )
              ])

Больше информации здесь: https://medium.com/flutter-community/breaking-layouts-in-rows-and- колонки-в-трепетания-8ea1ce4c1316

8
задан R. Martinho Fernandes 27 February 2009 в 09:23
поделиться

2 ответа

Не управляйте деревом компонента. Вместо этого управляйте моделью, которая представляет дерево компонента. Затем имейте свое представление, связывают с различными наборами и свойствами в той модели для создания ее зрительного ряда.

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

Во-первых, моя модель:

public abstract class Shape
{
    public double Left { get; set; }
    public double Top { get; set; }
}

public class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }
}

Затем, я выставляю набор упомянутых форм (Вы использовали бы другую модель для содержания этого набора). Затем я связываю с ним, по моему мнению:

<Window x:Name="_root" x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:Rectangle}">
            <Rectangle Width="{Binding Width}" Height="{Binding Height}" Stroke="Black"/>
        </DataTemplate>
    </Window.Resources>
    <ItemsControl DataContext="{Binding ElementName=_root}" ItemsSource="{Binding Shapes}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Canvas.Left" Value="{Binding Left}"/>
                <Setter Property="Canvas.Top" Value="{Binding Top}"/>
            </Style>
        </ItemsControl.ItemContainerStyle>
    </ItemsControl>
</Window>
8
ответ дан 5 December 2019 в 17:41
поделиться

Фундаментальная проблема в Вашем вопросе путает требования Ваших пользователей (управляющий объектами, которые представлены прямоугольниками и замещающими знаками (я только предполагаю)) с деталями реализации (добавление Rectangles и Ellipses к Canvases).

Снова, различные обязанности в шаблоне MVVM:

Посмотреть

Переведите ViewModel в пиксели и переведите входные события в вызовы метода на ViewModel.

Это было бы фактическими компонентами Silverlight (Rectangle, Ellipse, Canvas) привязка против их DataContext и наличие нескольких очень маленьких обработчиков событий или Commands или что бы то ни было.

Модель

Держите данные и бизнес-логику проблемно-ориентированным способом.

Это представляет "математические" прямоугольники и замещающие знаки, которые тянут Ваши пользователи.

ViewModel

Совершенствуйте Модель в ориентированном на UI и часто особенном методе примера использования.

Здесь Вы храните переходную информацию как "в настоящее время выбранный объект", которые важны для определенного представления, но не являются атрибутами понятия базовой Модели.

Прочитайте мой блог для больше на моих представлениях о MVVM.

2
ответ дан 5 December 2019 в 17:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: