Как остановить создание нескольких ViewModel - PullRequest
0 голосов
/ 10 мая 2019

Я запустил проект с использованием MVVM Light и столкнулся с проблемой, когда после создания окна к нему привязывается ViewModel, однако, если я закрою это окно и снова открою это окно, будет создана другая модель представления.

Через отладчик я вижу, как код перебирает свойства и методы после взаимодействия с формами.Я вижу много экземпляров одних и тех же коллекций / свойств / методов.Это затем создает ошибки «Out of Bounds» после удаления элементов и т. Д.

* Примечание: Использование ViewModelLocator, привязанного к XAML и полностью удаленного из файлов XAML.cs. ViewModels не упоминается где-либо еще.

Я попытался сделать следующее: справки нет.

(WPF / MVVM) Одиночный экземпляр в MainViewModel

Как мне справиться с этим, чтобы устранить несколько ViewModel изацикливание свойств / методов. Методы / свойства должны быть зациклены только один раз.

РЕДАКТИРОВАТЬ

Я решил свою проблему. С помощью ссылки на статическийКласс внутри ресурсов Windows Я создавал новый экземпляр для каждого ListView. Таким образом вынуждая ViewModel зацикливаться на условиях для удовлетворения тех экземпляров каждой формы, которая использовала экземпляр.

Удаляя ресурс и перемещая все данные в MVVM Light DataServiceи используя Task из System.Threading.Tasks, я могу связать коллекцию внутри ViewModel, а не независимый экземпляр.зацикливание рудыСпасибо за ответы.

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Вы всегда можете использовать Singleton Design Pattern

public sealed class Vm  
{  
    //Private Constructor.  
    private Vm()  
    {  
    }  
    private static Vm instance = null;  
    public static Vm Instance  
    {  
        get  
        {  
            if (instance == null)  
            {  
                instance = new Vm();  
            }  
            return instance;  
        }  
    }  
} 
1 голос
/ 10 мая 2019

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

Частично, поскольку пользователям довольно легко «потерять» несколько окон. Он также закрывает ряд случаев проблем совместного использования, когда у вас открыто окно X и когда вы открываете окно Y, происходит конфликт обработки.

Имея то, что у вас есть, одним простым способом решения этой проблемы является использование SimpleIOC для предоставления ваших моделей представления.

SimpleIOC дает вам синглтоны для всего, что вы просите.

Возможно, вы видели код:

        SimpleIoc.Default.GetInstance<vmType>();

Который, конечно, имеет определенный тип в этих угловых скобках.

Альтернатива:

        SimpleIoc.Default.GetInstance(vmType);

Где vmType может быть переменной. Переменная типа, которая соответствует форме желаемой модели представления.

Вы можете создать расширение разметки, которое принимает тип в качестве параметра и выполняет этот вызов, возвращая модель представления.

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

...