0

I'm trying to implement custom window for Catel using DevExpress DXWindow but a have a problem, DXWindow not have full support for this interface. I would like to know as on another can be implemented change notification? P.S. Sorry for my bad English.

public class DXWindowEx : DXWindow, IDataWindow
{
    private readonly WindowLogic logic;

    public DXWindowEx()
        : this(null)
    {
    }

    public DXWindowEx(IViewModel viewModel)
    {
        Type viewModelType = null;
        if (viewModel != null)
        {
            viewModelType = viewModel.GetType();
        }

        if (viewModelType == null)
        {
            var viewModelLocator = ServiceLocator.Default.ResolveType<IViewModelLocator>();
            viewModelType = viewModelLocator.ResolveViewModel(GetType());
            if (viewModelType == null)
            {
                const string error =
                    "The view model of the view could not be resolved. Use either the GetViewModelType() method or IViewModelLocator";
                throw new NotSupportedException(error);
            }
        }

        logic = new WindowLogic(this, viewModelType, viewModel);

        logic.ViewModelChanged += (sender, e) => ViewModelChanged.SafeInvoke(this, e);
        logic.ViewModelPropertyChanged += (sender, e) => ViewModelPropertyChanged.SafeInvoke(this, e);

        //This code did'n work
        //logic.PropertyChanged += (sender, e) => PropertyChanged(sender, e); 


        //PropertyChanged
        // Because the RadWindow does not close when DialogResult is set, the following code is required
        ViewModelChanged += (sender, e) => OnViewModelChanged();

        // Call manually the first time (for injected view models)
        OnViewModelChanged();

        WindowStartupLocation = WindowStartupLocation.CenterScreen;
        SetBinding(TitleProperty, new Binding("Title"));
    }


    public IViewModel ViewModel
    {
        get { return logic.ViewModel; }
    }

    public event EventHandler<EventArgs> ViewModelChanged;

    public event EventHandler<PropertyChangedEventArgs> ViewModelPropertyChanged;

    private void OnViewModelChanged()
    {
        if (ViewModel != null && !ViewModel.IsClosed)
        {
            ViewModel.Closed += ViewModelClosed;
        }
    }

    private void ViewModelClosed(object sender, ViewModelClosedEventArgs e)
    {
        Close();
    }
}

1 Answers1

1

If the problem is here:

//This code did'n work
logic.PropertyChanged += (sender, e) => PropertyChanged(sender, e); 

then the solution is adding the PropertyChanged event declaration as it specified in catel documentation for this situation.

//...
logic.PropertyChanged += (sender, e) => PropertyChanged.SafeInvoke(this, e);
//...
public event EventHandler<PropertyChangedEventArgs> PropertyChanged;
//...

P.S. It is not quite clear to me what did you meaning when said that DXWindow do not have full support for IDataWindow interface. And it is difficult to determine the cause of your issue due to a lack of information about the exact issue. Please make your question as clear as is possible.

DmitryG
  • 17,677
  • 1
  • 30
  • 53