Невозможно добавить детей в Grid при привязке к виртуальной машине с Caliburn Micro - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу добавить (любые) элементы в сетку из моей модели представления в моем приложении Caliburn.Micro (это действительно надстройка Revit, поэтому не совсем приложение, но должно работать так же).

Мне трудно сосредоточиться на определенных аспектах модели MVVM и привязать данные к элементам в представлении ...

Моя ViewModel

public class MyViewModel : Screen
{
    private Grid _myGrid;
    public Grid MyGrid
    {
        get { return _myGrid; }
        set
        {
            _myGrid = value;
            NotifyOfPropertyChange(() => MyGrid);
        }
    }

    public MyViewModel()
    {
        MyGrid = new Grid();
        var label = new Label { Content = "Hello!" };
        MyGrid.Children.Add(label); // I know this isn't MVVM but how can I do basically this?
    }
}

Мой просмотр

<Window x:Class="MyProject.MyView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        xmlns:cal="http://www.caliburnproject.org"
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
        xmlns:local="clr-namespace:MyProject.Views"
        mc:Ignorable="d">

    <Grid x:Name="MyGrid">
        <!-- Here goes stuff from view model -->
    </Grid>
</Window>

Я знаю, что это все неправильно ... Мне нужна помощь, чтобы получить элементы в элемент сетки из модели представления.

1 Ответ

0 голосов
/ 24 апреля 2020

Общий подход, который вы здесь используете, неверен, когда вы создаете элементы View в вашей ViewModel. С MVVM вы все еще хотите создать свой пользовательский интерфейс (представление) в XAML. В вашем случае вы все равно создадите Grid и Label в вашем XAML в большинстве случаев. Подумайте, что вы делаете с этим подходом.

У вас есть модель данных, которая хранит свойства данных и уведомляет об изменениях. Думайте об этом как о структурной стороне данных.

public class MyModel : INotifyPropertyChanged
{
    private string labelValue;
    public string LabelValue
    {
        get { return labelValue; }
        set
        {
            labelValue = value;
            NotifyOfPropertyChange(() => LabelValue);
        }
    }

    //Property changed handler logic below.
    //I assume you have something based on your code.
}

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

public class MyViewModel
{
    //Add a property for the model you created
    public MyModel NewModel {get;set;}

    //Load the NewModel values when the view model is created.
    public MyViewModel()
    {
        NewModel = new MyModel(){LabelValue="Hello World"};
    }
}

Хорошо, поэтому у нас есть данные Model, и у нас есть ViewModel, чтобы фактически использовать Model и заполнить его значениями. Теперь давайте создадим пользовательский интерфейс (View) и свяжем его с ViewModel.

. В вашем Window вы создадите метку и просто привяжете желаемое свойство ViewModel. В этом случае мы будем использовать свойство вашей модели LabelValue.

<Grid>
     <Label Content="{Binding NewModel.LabelValue}"/>
</Grid>

Теперь мы просто устанавливаем текст данных в коде пользовательского интерфейса

public MyViewModel myViewModel = new MyViewModel(); //Create the ViewModel
public MyWindow()
{
     InitializeComponent();  
     //Set the DataContext to the ViewModel
     DataContext = myViewModel;
}

Когда вы запускаете программу, содержимое метки должно быть таким, какое вы указали в свойстве ViewModel MyModel.LabelValue. Это всего лишь простое объяснение очень большой концепции, но оно должно дать вам представление о том, как она работает. Есть также много методов и стилей, которые используют люди MVVM, но это понятие MVVM в его самой основной форме c. Надеюсь, это даст вам идею и направит вас на правильный путь.

Цель состоит в том, чтобы запустить ваши логи c в вас ViewModel, чтобы можно было построить View s и Model s. с минимальным кодом. Если вы правильно реализуете INotifyPropertyChanged, все значения в вашем View автоматически обновляются без дополнительного кода или блокировки потока пользовательского интерфейса. Хотя вначале концепция кажется громоздкой, в долгосрочной перспективе она экономит много времени и усилий.

...