Это не то, для чего вы используете события.События существуют для облегчения развязки: объект, вызывающий событие, не должен знать или не заботиться о том, что делают объект (ы), слушающие его.Вы ожидаете, что событие сможет изменить значение свойства из установщика свойства - или, что еще хуже, ваш обработчик событий вызывает тот самый установщик свойства, который вызывает событие, которое он обрабатывает, а это значит, что вы должны что-то сделатьдовольно хакерски, чтобы избежать переполнения стека.
Ваше описание не очень понятно (вы описываете как проблему, которую вы испытываете, так и нерабочие решения, которые вы пытаетесь одновременно,сбивает с толку), но звучит так, как будто вы пытаетесь сделать что-то вроде:
if (IsValid(value))
{
_Property = value;
}
else
{
_Property = GetValueFromDialog();
}
Проблема в том, что вы не хотите иметь код в своей модели представления, которая выдает диалог,поскольку это создает модель представления, которая не может быть протестирована вне вашего приложения WPF.
Ответ в этом случае заключается в использовании внедрения зависимостей.Создайте интерфейс с именем IDialogService
:
interface IDialogService
{
object GetValueFromDialog();
}
Теперь добавьте это свойство в модель представления:
public IDialogService DialogService { get; set; }
Код выше:
if (IsValid(value))
{
_Property = value;
}
else
{
_Property = DialogService.GetValueFromDialog();
}
Создатьдиалоговый сервис для использования в вашем приложении WPF, который фактически выдает диалог и получает результат.Когда вы создаете экземпляр модели представления в своем приложении, сделайте следующее:
MyViewModel vm = new MyViewModel { DialogService = new WpfDialogService(); }
Таким образом, в вашем приложении установщик свойств выведет диалоговое окно и получит результат в точности так, как вы ожидаете.
Для своих юнит-тестов создайте фиктивный диалог, который выглядит следующим образом:
public class MockDialogService : IDialogService
{
private object Result;
public MockDialogService(object result)
{
Result = result;
}
public object GetValueFromDialog() { return Result; }
}
Затем вы можете написать тест, например:
MyViewModel vm = new MyViewModel { DialogService = MockDialogService(ExpectedResult) };
vm.Property = InvalidValue;
Assert.AreEqual(ExpectedResult, vm.Property);
Вышеприведенный пример - скорее эскизрешения, а не решения - в зависимости от того, как ваше приложение использует диалоги, вам может понадобиться гораздо больше функций, чем показано здесь.Если вы посмотрите на фреймворки MVVM, то обнаружите, что многие из них реализуют те или иные диалоговые сервисы.