0

我正在尝试使用 DevExpress DXWindow 为 Catel 实现自定义窗口,但有一个问题,DXWindow 不完全支持此接口。我想知道关于另一个可以执行更改通知吗?PS对不起我的英语不好。

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();
    }
}
4

1 回答 1

1

如果问题在这里:

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

然后解决方案是添加 PropertyChanged 事件声明,因为它在catel 文档中针对这种情况指定。

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

PS我不太清楚DXWindow不完全支持IDataWindow接口是什么意思。由于缺乏有关确切问题的信息,因此很难确定问题的原因。请尽可能清楚地说明您的问题。

于 2013-07-16T15:03:19.180 回答