2012-05-15 8 views
4

Я не могу найти решение следующей задачи:Caliburn Micro: DialogResult

я открыть диалог с WindowManager из Caliburn микро:

public void UserNew() 
{ 
    this._windowManager.ShowDialog(new UserViewModel(this._windowManager)); 
} 

Теперь мне нужен DialogResult когда пользователь близко диалог с кнопкой OK. Метод ShowDialog WindowManager не возвращает DialogResult ...

Может ли кто-нибудь мне помочь?

ответ

5

Я использую View Model для определения того, что произошло в диалоговом окне. Например, у вас может быть свойство IsCancelled на вашем UserViewModel, которое вы можете опросить после возвращения из вызова ShowDialog. Что-то вроде:

public void UserNew() { 
    var userViewModel = new UserViewModel(this._windowManager); 
    this._windowManager.ShowDialog(userViewModel); 
    if (userViewModel.IsCancelled) { 
     // Handle cancellation 
    } else { 
     // Handle other case(s) 
    } 
} 
+0

Спасибо, это хорошее решение! –

+1

см. Мой ответ, где вам нужно только наследовать от экрана, и вам не нужно добавлять свойство к vm. – juFo

0

Диалоги WPF возвращают nullable bools вместо DialogResults. ShowDialog Caliburn также возвращает bool?

От MSDN

Диалоги обычно позволяют пользователям принять или отменить задание для которой они были показаны до закрытия диалогового окна. ShowDialog возвращает значение Nullable Boolean, которое указывает, было ли принято или отменено действие . Возвращаемое значение - это значение свойства DialogResult до закрытия окна. Для получения дополнительной информации см. Раздел DialogResult.

DialogResult выше относится к bool собственности под названием DialogResult на System.Windows.Window.

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

+0

Как я могу установить значение обнуляемого логическое значение? В настоящее время я закрываю диалог с (GetView() как Window) .Close() из модели диалогового окна. –

+1

Я нашел также решение установить возвращаемое значение bool в UserViewModel: var window = GetView() как Window; window.DialogResult = false; window.close(); –

-1

Вы можете установить DialogResult, нажав кнопки события в представлении. Это будет возвращено методом Caliburn Micro WindowManager.ShowDialog().

В коде вызывающего абонента:

IWindowManager wm = AppContext.GetService<IWindowManager>(); 
var dialog = new DialogViewModel(); 
var result = wm.ShowDialog(dialog); 
if (result.HasValue && result.Value) 
{ 
    // Act on result 
} 
// Ignore result 

В диалоговом коде:

private void Ok_OnClick(object sender, RoutedEventArgs e) 
{ 
    DialogResult = true; 
} 

private void Cancel_OnClick(object sender, RoutedEventArgs e) 
{ 
    DialogResult = false; 
} 

В диалоговом XAML файле:

<Button x:Name="Ok" 
    Content="Ok" 
    Click="Ok_OnClick" /> 
<Button x:Name="Cancel" 
    Content="Cancel" 
    Click="Cancel_OnClick"/> 

В ViewModel:

public void Ok() 
{ 

} 

public void Cancel() 
{ 

} 

Я подтвердил, что Ok() и Cancel() звонков сделаны, что Ok_OnClick()Cancel_OnClick() событий увольняют, и что возвращаемое значение IWindowManager.ShowDialog() правильно.

+3

-1: Вы не должны работать с Caliburn Micro. и, конечно же, не добавлять события к коду вашего взгляда! – juFo

+0

Пожалуйста, мотивируйте, почему мой комментарий был опущен. – juFo

6

В Caliburn микро в вашем dialogviewmodel, который наследуется от экрана вы можете сделать:

TryClose(true); // for OK 

или

TryClose(false); // for Cancel 

, то вы можете сделать:

var vm = IoC.Get<MyViewModel>(); 
var r = WindowManager.ShowDialog(vm, null, null); 

if (r.HasValue && r.Value) { 
    // do something on OK 
} 

ваш XAML из диалог может выглядеть так:

<Button Content="OK" cal:Message.Attach="[Event Click] = [AcceptButton()]" /> 
<Button Content="Cancel" cal:Message.Attach="[Event Click] = [CancelButton()]" /> 

используя это пространство имен:

xmlns:cal="http://www.caliburnproject.org" 

Это подробный пример кода диалогового реализации ViewModel:

public bool CanAcceptButton 
{ 
    get { return true; /* add logic here */ } 
} 

public void AcceptButton() 
{ 
    TryClose(true); 
} 

public bool CanCancelButton 
{ 
    get { return true; } 
} 

public void CancelButton() 
{ 
    TryClose(false); 
} 
+0

вместо «var r = WindowManager ...» измените это на «bool? R = WindowManager ...» , потому что если вы вернете TryClose (false), то Visual Studio 2010 сделает его логическим и завершится с ошибкой if (r .HasValue), потому что bool не имеет .HasValue. – juFo

Смежные вопросы