Каков наилучший способ открыть окно xaml из ViewModle и дождаться DialogResult? - PullRequest
1 голос
/ 27 мая 2011

Курс валют, я использую как ниже.

В 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.

            }

Что может быть лучшим способом сделать этот рабочий процесс? Пожалуйста, порекомендуйте. Спасибо.

1 Ответ

1 голос
/ 08 июня 2011

Прочитать Шаблоны взаимодействия с пользователем в эту документацию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...