Silverlight 提交时是否可以编辑WCF Ria服务实体?
我有一个使用WCF RIA服务的silverlight应用程序 我想在每次更改属性时提交更改 但是,如果用户在提交完成之前尝试更改同一实体中的另一个属性,则会出现以下错误: 此实体当前为只读。存在以下条件之一:已调用自定义方法、正在进行提交操作或实体类型不支持编辑操作 场景:Silverlight 提交时是否可以编辑WCF Ria服务实体?,silverlight,wcf,ria,Silverlight,Wcf,Ria,我有一个使用WCF RIA服务的silverlight应用程序 我想在每次更改属性时提交更改 但是,如果用户在提交完成之前尝试更改同一实体中的另一个属性,则会出现以下错误: 此实体当前为只读。存在以下条件之一:已调用自定义方法、正在进行提交操作或实体类型不支持编辑操作 场景: 用户更改实体1中的属性A 应用程序捕获更改并提交WCF数据上下文 用户更改实体1中的属性B后不久。但是,由于正在提交,此属性为只读 是否可以更改DataContext的行为,以便我可以在提交过程中更新实体?请注意-我可能会
是否可以更改DataContext的行为,以便我可以在提交过程中更新实体?请注意-我可能会对此响应感到厌烦: 让我试着听听你的话: 如果我是正确的,在接口上,值被更改,这些值被绑定到某个实体。此实体是您希望在服务器上实时更新的实体。如果是这样,我建议: 假设我有一个文本框,当用户在文本框中键入值时,它会更新绑定实体,我希望该实体同时在服务器上更新-定义一个行为以采用keyup方法并触发,例如(
AssociatedObject.GetBindingExpression(TextBox.TextProperty).UpdateSource();
)
此外,在这种行为中,我会给文本框定义一个方法来绑定OnKeyUp事件,允许我,也就是说,一旦用户按下“Enter”,然后在服务器上实际执行udpate。此外,我会创建一个加载屏幕/子窗口来显示“saving”-这将导致“阻塞”发生,以防止在保存过程中出现任何进一步的用户干预。在回电话的时候。我会关上窗户,上面写着装货
现在,就像我说的,我不确定这是否是你想要的答案,但这个想法背后的理论,特别是只有进入或最终改变时才被阻挡似乎是你最好的选择。文本框的行为示例如下:
包括您的库:使用CustomControlsUI.Extensions代码>
定义文本框的类:public类ttextboxkeyubehavior:Behavior
为要动态绑定到的ontextkeyup定义方法指针:protectedmethodinfo 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()); }
}
}
用法:
包括存储行为的命名空间:xmlns:ccui=“clr namespace:CustomControlsUI.Behaviors;assembly=CustomControlsUI”
包括System.Windows.Interactive和Microsoft.Expression.Interactions的名称空间:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
将OnKeyUpt附加到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>
最后定义向上键方法以通知服务器更改:
#region "Helper Method"
public void OnSearchKeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter && IsSearchStateValid==true)
{
OnFindCustomers(sender);
}
}
#endregion
请注意:我可能对这个答案感到困惑。但这只是基于我认为你在寻找的
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