2010-08-17 5 views
0

Я работаю с древовидной структурой с использованием WPF и шаблона MVVM. Я начинаю с создания 20 корневых узлов и ленивой загрузки дочерних узлов при каждом щелчке каждого узла. Так например ... если у меня есть следующее:Могу ли я подавить вызов «CanExecute» в шаблоне MVVM

Level 1 
    Level 1.1 
Level 2 
Level 3 
    Level 3.1 
    Level 3.2 

Уровни 1, 2 и 3 загружаются во время выполнения. Уровни 1.1, 3.1 и 3.2 не будут загружены до тех пор, пока их соответствующие родители не будут нажаты. Уровни ниже 1.1 и т. Д. Загружаются одинаково, нажимая на их родителя.

Моя проблема - когда я нажимаю на уровень 1.1 для загрузки своих детей, метод «CanExecute» проверяется для уровня 1.1 и всех элементов корневого уровня для каждого ребенка уровня 1.1. Это вызывает немало времени впустую, если есть множество детей.

Мой вопрос: могу ли я как-то подавить звонок на «CanExecute»? Мне не нужно называть это как эти под-уровни, и я хотел бы обойти его. Я очень новичок в структуре MVVM, поэтому я не уверен, что это возможно.

ответ

1

Если вы используете Prism (Composite Application Guidance для WPF и SilverLight) «DelegateCommand» в вашей модели просмотра, вам нужно будет явно вызвать команду .RaiseCanExecuteChanged всякий раз, когда вы хотите, чтобы на нее вызывается CanExecute.

+0

К сожалению, мы не используем Призма. Мы используем инфраструктуру Unity. Я должен был уточнить, что в моем вопросе. –

+0

Вам не нужно использовать Prism для использования DelegateCommand. Вы можете просто вытащить его из исходного кода или любой другой реализации DelegateCommand в interwebs. Это ОЧЕНЬ простой класс. Это, как говорится, недостаточно для решения вашей «проблемы». Это связано с тем, что «CanExecute» вызывается WPF независимо от события CanExecuteChanged. Я поставил «проблему» в кавычки, потому что задаю вопрос, действительно ли это проблема. Если ваша реализация CanExecute быстрая и малая (это должно быть), это не имеет значения. Какую проблему вы пытаетесь решить, подавив вызов в CanExecute? –

+0

Брайан прав в том, что вам не нужно использовать Prism для использования DelegateCommand. Но вытаскивание вещей из библиотеки и использование везде, где вы хотите, почти всегда являются проблемой поддержания. Сказанное я принимаю мое утверждение, что вам придется всегда явно вызывать RaiseCanExecuteChanged для вызываемого CanExecute, как неверного. Приложение для призмы структурировано таким образом, что это происходит, но не обязательно всегда верно. – NVM