2011-05-27 61 views
1

Currenlty,我使用如下。什麼是從ViewModle打開xaml窗口並等待DialogResult的最佳方式?

在XAML,

<Button Content="X" Width="33" Height="16" Padding="1,-2,1,0" 
Command="{Binding ElementName=UserControlName, Path=DataContext.DenyCommand}" 
    <Button.CommandParameter> 
    <wpfext:UICommandParameter UICommandCallerCallback="{Binding ElementName=UserControlName, Path=UIDenyCallBackCommand}"/> 
    </Button.CommandParameter> 
</Button> 

在xaml.cs,

public UICommandCallerCallback UIDenyCallBackCommand 
     { 
      get; 
      private set; 
     } 
public UserControlName() 
     { 

      this.UIDenyCallBackCommand = this.UIAccessDenyCallBack; 
      this.InitializeComponent(); 

     } 

public void UIAccessDenyCallBack(object commandParameter, object callbackData) 
     { 
      ShowADenyMsgBox(); 
     } 

private void ShowDenyMsgBox() 
{ 
      RightsDenied win = new RightsDenied(); //xaml window 
      win.Owner = GetImmediateWindow(); 
      win.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
      win.ShowDialog(); 
} 

在ViewModel.cs,

internal ViewModel() 
     { 
     this.DenyCommand= new DenyCommand(this.AccessDeny); 
     } 
public void AccessDeny(ICommandState commandState) 
     { 
      commandState.InvokeCallerCallback("AccessDenied"); 
     } 

public CommandCallback DenyCommand 
     { 
      get; 
      private set; 
     } 

UICommandCallerCallback的聲明如下。

public delegate void UICommandCallerCallback(object commandParameter, object callbackData); 

CommandCallback類如下所示。

public class CommandCallback:ICommand 
    { 
     private readonly Action<ICommandState> executeMethod; 

     private readonly Func<ICommandState, bool> canExecuteMethod; 

     public CommandCallback(Action<ICommandState> executeMethod) 
      : this(executeMethod, null) 
     { 
     } 

     public CommandCallback(Action<ICommandState> executeMethod, Func<ICommandState, bool> canExecuteMethod) 
     { 
      if (executeMethod == null) 
      { 
       throw new ArgumentNullException("executeMethod"); 
      } 
      this.executeMethod = executeMethod; 
      this.canExecuteMethod = canExecuteMethod; 
     } 

     public bool CanExecute(object parameter) 
     { 
      return this.canExecuteMethod != null ? this.canExecuteMethod((ICommandState)parameter) : true; 
     } 

     public void Execute(object parameter) 
     { 
      if (parameter == null) 
      { 
       throw new ArgumentNullException("parameter","CommandCallback parameter cannot be null"); 
      } 
      if (!(parameter is ICommandState)) 
      { 
       throw new ArgumentException("expects a parameter of type ICommandState","parameter"); 
      } 

      ICommandState state = (ICommandState)parameter; 
      this.executeMethod.Invoke(state); 
     } 

     public event EventHandler CanExecuteChanged 
     { 
      add 
      { 
       CommandManager.RequerySuggested += value; 
      } 

      remove 
      { 
       CommandManager.RequerySuggested -= value; 
      } 
     } 
    } 

它的正常工作,如果它只是彈出的對話框中,但我想等待對話的結果,並希望繼續AccessDeny()函數。例如。

public void AccessDeny(ICommandState commandState) 
      { 
       1. processs 
       2. open xaml window and wait for the dialogresult. (i.e Yes No or Cancel) 
       3. Based on the result, continue processing. 

      } 

什麼可能是最好的方式來做這個工作流程?請指教。謝謝。

+0

爲什麼從視圖模型向視圖發送消息?如果要在視圖模型中顯示對話框,該怎麼辦?這是執行此工作流程的最直接方式。 – vorrtex 2011-05-27 16:19:51

+0

根據我們的項目工作流程,我不能這樣做。如果我使用EventHandler,它可以作爲我的工作流程。但是,每當usercontrol被卸載時,我需要分離事件並且速度很慢。而且,我正在使用winform來彈出。 – TNA 2011-05-30 01:27:10

+0

sry,我的意思是我用xaml窗口彈出,而不是窗體。 – TNA 2011-05-30 02:20:25

回答

相關問題