可以在提交时编辑WCF Ria Services实体吗?

时间:2011-11-18 19:26:45

标签: silverlight wcf ria

我有一个使用WCF RIA服务的silverlight应用程序。

我希望每次更改属性时都提交更改。

但是,如果用户在提交完成之前尝试更改同一实体中的另一个属性,则会出现以下错误:

“此实体当前是只读的。存在以下条件之一:已调用自定义方法,正在进行提交操作,或实体类型不支持编辑操作”

情境:

  1. 用户更改实体1中的属性A
  2. 应用程序捕获更改并提交WCF DataContext
  3. 用户更改实体1中的属性B后不久。但由于正在提交,此属性为只读。
  4. 是否可以更改DataContext的行为,以便我可以在提交过程中更新实体?

1 个答案:

答案 0 :(得分:0)

请注意 - 我可能会因此回应而错过:

让我试着说出你的意思:    如果我是正确的,在接口上,正在更改绑定到某个实体的值。此实体是您希望在服务器上实时更新的内容。如果是这种情况,我会建议:    假设我有一个文本框,当用户在文本框中键入值时,它会更新绑定实体,我希望同时在服务器上更新该实体 - 定义一个行为以获取keyup方法并触发例如(AssociatedObject.GetBindingExpression(TextBox.TextProperty).UpdateSource();) 此外,在这种行为中,我会给文本框定义一个绑定到OnKeyUp事件的方法的能力,允许我说,一旦用户按下“Enter”然后在服务器上实际执行udpate。另外,我会创建一个加载屏幕/子窗口来说“保存” - 然后会导致“阻塞”,以防止在保存期间进一步的用户干预。在回电话。我会关闭说装载的窗口。

现在,就像我说的那样,我不确定这是否是您正在寻找的答案,但这个想法背后的理论,特别是仅在进入或最终改变时的阻止似乎是您最好的选择。下面是文本框行为的示例:

包括您的图书馆:using CustomControlsUI.Extensions; 定义文本框的类:public class TTextBoxKeyUpBehavior:Behavior<TextBox> 定义要动态绑定到的ontextkeyup的方法指针:protected MethodInfo OnTextBoxKeyUp { get; set; } 定义名称要绑定到的OnTextKeyUpMethod的公共字符串:OnTextBoxKeyUpMethod

在行为中定义TextboxKeyUp事件:

    /// <summary>
    /// Method impl. for the onkey up event
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void TextBoxKeyUp(object sender, KeyEventArgs e)
    {
        if (!object.ReferenceEquals(AssociatedObject.GetBindingExpression(TextBox.TextProperty), null))
        {

            AssociatedObject.GetBindingExpression(TextBox.TextProperty).UpdateSource();
        }
        if (!string.IsNullOrEmpty(OnTextBoxKeyUpMethod) && !object.ReferenceEquals(AssociatedObject,null) && 
            !object.ReferenceEquals(AssociatedObject.DataContext,null))
        {
            try
            {
                //use reflection to try and find the method being pointed to.
                if (object.ReferenceEquals(OnTextBoxKeyUp, null))
                {
                    MethodInfo _m = null;
                    _m = AssociatedObject.DataContext.GetType().GetMethod(OnTextBoxKeyUpMethod, new Type[] { typeof(object), typeof(KeyEventArgs) });
                    if (!object.ReferenceEquals(_m, null))
                        //set the pointer to the on text box key up method
                        OnTextBoxKeyUp = _m;
                }
                OnTextBoxKeyUp.Invoke(AssociatedObject.DataContext, new object[] { sender, e });
            }
            catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); }
        }
    }

重写On Attached和On Detached方法:

protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.KeyUp += TextBoxKeyUp;
    }
    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.KeyUp -= TextBoxKeyUp;
    }

使用方法:   包括存储行为的命名空间:xmlns:ccui="clr-namespace:CustomControlsUI.Behaviors;assembly=CustomControlsUI"

包括System.Windows.Interactivity和Microsoft.Expression.Interactions的命名空间:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
       xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

将OnKeyUpTo附加到viewmodel中所需的方法:

<TextBox Grid.Column="1" Grid.Row="1" Height="23" HorizontalAlignment="Left" Margin="6,4,0,0" 
                                          Name="txtFirstName" VerticalAlignment="Top" Width="200" Text="{Binding FirstName, Mode=TwoWay}">
                                    <i:Interaction.Behaviors>
                                        <ccui:TTextBoxKeyUpBehavior OnTextBoxKeyUpMethod="OnSearchKeyUp" />
                                    </i:Interaction.Behaviors>
                                </TextBox>

在视图模型中实现应该实现System.ComponentModel中找到的INotifyPropertyChanged的方法和属性

public string FirstName 
    { 
        get 
        { 
            return __fFirstName; 
        }
        set
        {
            __fFirstName = value;
            //this is a custom extension on INotifyPropertyChanged
            this.NotifyPropertyChanged("FirstName", PropertyChanged);
        }
    }

最后定义密钥向上方法以通知服务器更改:

#region "Helper Method"
    public void OnSearchKeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter && IsSearchStateValid==true)
        {
            OnFindCustomers(sender);
        }
    }
    #endregion

请注意:我的回答可能非常友好。但它只是基于我认为你正在寻找的......