【问题标题】:How to resolve view not closing on .Close()?如何解决视图未关闭 .Close()?
【发布时间】:2015-12-18 14:48:38
【问题描述】:

为了打开 ProductView,我添加了一个 DialogService,到目前为止 ShowDetailDialog() 正在按预期工作。

问题:

我在 ProductView 上调用 Close(),视图没有关闭。我通过在对对话服务关闭方法的调用上设置断点来调试此问题。

当我单步执行代码时,null 检查显示 productView 为 null,这会阻止调用 Close()

有谁知道为什么 productView 为空? (虽然它在视图上显示数据)

DialogService:(承载 Show 和 Close 方法)

namespace MongoDBApp.Services
{
    class DialogService : IDialogService
    {

        Window productView = null;
        ProductView _productView;

        public DialogService()
        {
            _productView = new ProductView();
        }

        public void CloseDetailDialog()
        {

            if (productView != null)
                productView.Close(); 
        }

        public void ShowDetailDialog()
        {
            _productView.ShowDialog();
        }
    }
}

ProductViewModel:(ProductVM总结,调用SaveCommand上的close方法)

        private void SaveProduct(object product)
        {
            _dialogService.CloseDetailDialog();
            Messenger.Default.Send<ProductModel>(SelectedProduct);
        }

CustomerOrdersViewmodel:(最初调用 ShowDetailDialog() 的地方)

        private void EditOrder(object obj)
        {
            Messenger.Default.Send<ProductModel>(SelectedProduct);
            _dialogService.ShowDetailDialog();                         
        }

【问题讨论】:

  • 你在哪里打电话ShowDetailDialog
  • 在 CustomerOrdersVM 中,我现在将其发布。 ShowDetailDialog 正在工作,只是由于某种原因没有关闭。
  • 使用ShowDialog时,通常需要设置DialogResult属性。 Close 方法将用于非模态窗口。
  • @SriramSakthivel 能否通过设置 DialogResult 举例说明您的意思?

标签: c# wpf dialog


【解决方案1】:

这就是我一直关闭窗户的方式。

这是我的命令:

class CancelCommand : ICommand
    {
        private NewTruckViewModel newTruck;
        public CancelCommand(NewTruckViewModel vm)
        {
            newTruck = vm;
        }
        public event EventHandler CanExecuteChanged;

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            newTruck.Cancel();
        }
    }

这是我的视图模型和从我的命令调用的方法:

 private NewTruck myWnd; //View Declaration

//Ctor where I set myView (myWnd) equal to a view that is passed in.
public NewTruckViewModel(ObservableCollection<Truck> Trucks, NewTruck wnd, bool inEditTruck)
        {
            myEngine.stopHeartBeatTimer();
            editTruck = inEditTruck;
            myWnd = wnd;
            SaveTruckCommand = new SaveTruckCommand(this);
            CancelCommand = new CancelCommand(this);
            ClearCommand = new ClearCommand(this);
            SetLevel1MTCommand = new SetLevel1MTCommand(this);
            SetLevel2MTCommand = new SetLevel2MTCommand(this);
            SetLevel3MTCommand = new SetLevel3MTCommand(this);
            SetLevel1FLCommand = new SetLevel1FLCommand(this);
            SetLevel2FLCommand = new SetLevel2FLCommand(this);
            SetLevel3FLCommand = new SetLevel3FLCommand(this);
            myTrucks = Trucks;
        }
     public void Cancel()
            {
                myWnd.Close();
            }

这对我有用。

【讨论】:

    【解决方案2】:

    我通过在视图上实现 IDialogService 解决了这个问题。然后从 ViewModel 调用 Show() 和 Close() 方法。

    解决方案:

    界面:

    public interface IDialogService
    {
        void CloseDialog();
        void ShowDialog(EditProductViewModel prodVM);
    
    }
    

    查看:

    public partial class ProductView : Window, IDialogService
    {
    
        public ProductView()
        {
            InitializeComponent();
            this.DataContext = new EditProductViewModel(this);
    
        }
    
        public void CloseDialog()
        {
            if (this != null)
                this.Visibility = Visibility.Collapsed;
        }
    
        public void ShowDialog(EditProductViewModel prodVM)
        {
            this.DataContext = prodVM;
            this.Show();
        }
    
        private void Window_Closed(object sender, EventArgs e)
        {
            this.Visibility = Visibility.Collapsed;
        }
    
    
    }
    

    ViewModel #1:

        private IDialogService _dialogService;
    
        public CustomerOrdersViewModel(IDialogService dialogservice)
        {
            this._dialogService = dialogservice;                
        }
    
    
        private void EditOrder(object obj)
        {
            EditProductViewModel pvm = new EditProductViewModel(_dialogService);
            pvm.Present(pvm);
            Messenger.Default.Send<ProductModel>(SelectedProduct);                              
        }
    

    ViewModel #2:

        private IDialogService _dialogService;
    
    
        public EditProductViewModel(IDialogService dialogService)
        {
           this._dialogService = dialogService;  
        }
    
    
        private void SaveProduct(object product)
        {
            SelectedProduct = SelectedProductTemp;
            _dialogService.CloseDialog();
        }
    
        public void Present(EditProductViewModel prodVM) 
        {
            _dialogService.ShowDialog(prodVM);
        }
    

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 2022-08-06
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2022-01-03
      • 2020-12-26
      相关资源
      最近更新 更多