Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我得到一个;CopyState中的编辑级别不匹配”;CSLA中的错误取决于执行BeginEdit的位置_C#_Wpf_.net 4.5_Undo Redo_Csla - Fatal编程技术网

C# 我得到一个;CopyState中的编辑级别不匹配”;CSLA中的错误取决于执行BeginEdit的位置

C# 我得到一个;CopyState中的编辑级别不匹配”;CSLA中的错误取决于执行BeginEdit的位置,c#,wpf,.net-4.5,undo-redo,csla,C#,Wpf,.net 4.5,Undo Redo,Csla,我目前正在使用CSLA 4.5,遇到了一个错误 CopyState中的编辑级别不匹配 奇怪的是,如果我在一段代码中对业务对象执行BeginEdit()调用,它没有问题,但是如果我将它放在弹出窗口逻辑中,它会抛出这个异常,我不知道为什么。奇怪的关键在于它是同一个对象: MainControl.xaml.cs: public void ShowPopup() { // ... var target = ...; //target.BeginEdit(); <== No

我目前正在使用CSLA 4.5,遇到了一个错误

CopyState中的编辑级别不匹配

奇怪的是,如果我在一段代码中对业务对象执行
BeginEdit()
调用,它没有问题,但是如果我将它放在弹出窗口逻辑中,它会抛出这个异常,我不知道为什么。奇怪的关键在于它是同一个对象:

MainControl.xaml.cs

public void ShowPopup()
{
    // ...

    var target = ...;
    //target.BeginEdit(); <== No problem if I uncomment this

    var window = new PopupWindow
                 {
                     DataContext = new ConfirmationViewModel(target),
                     IsApplyCancel = true,
                     Owner = this,
                 };

    window.Show();
}
public class PopupWindow : Window
{
    private static void OnIsApplyCancelChanged(object sender, DependencyPropertyChangedEventArgs args)
    {
        var window = sender as Window;

        if (window != null)
        {
            var context = window.DataContext as CSLAViewModelBase;

            if (context != null)
            {
                var target = context.Target;

                target.BeginEdit(); // EXCEPTION!!!
            }
        }
    }
}
public class ConfirmationViewModel : CSLAViewModelBase
{
     public ConfirmationViewModel(BusinessBase target)
         : base(target) { ... }
}
确认视图模型.cs

public void ShowPopup()
{
    // ...

    var target = ...;
    //target.BeginEdit(); <== No problem if I uncomment this

    var window = new PopupWindow
                 {
                     DataContext = new ConfirmationViewModel(target),
                     IsApplyCancel = true,
                     Owner = this,
                 };

    window.Show();
}
public class PopupWindow : Window
{
    private static void OnIsApplyCancelChanged(object sender, DependencyPropertyChangedEventArgs args)
    {
        var window = sender as Window;

        if (window != null)
        {
            var context = window.DataContext as CSLAViewModelBase;

            if (context != null)
            {
                var target = context.Target;

                target.BeginEdit(); // EXCEPTION!!!
            }
        }
    }
}
public class ConfirmationViewModel : CSLAViewModelBase
{
     public ConfirmationViewModel(BusinessBase target)
         : base(target) { ... }
}

数据绑定UI通常查找IEditableObject,并在对象绑定到表单时自动调用它。该接口不知道n级撤销,所以如果Csla检测到对这些方法的多次调用,它会抛出一个异常。您可能不需要在对话框中使用BeginEdit,只需要在将对象从窗体中解除绑定后考虑Cancel或EndEdit

我相信ViewModelBase也能为您做到这一点