我有一个Silverlight 3项目。我有一个textbox,它是绑定到对象的TwoWay数据。如果用户想要取消对文本框所做的更改,那么撤消对对象上绑定字段的更改的最佳方法是什么?
我知道我可以在加载对象时将初始值存储在单独的变量中,但我想知道是否有更好的方法来做到这一点?
谢谢。
发布于 2010-02-18 00:32:29
如果要在设置值时回滚,则在属性设置器中引发异常。如果您需要在提交时进行回滚,那么您应该将设置存储在单独的类中,并提供原子设置和回滚-确保您的每个属性都支持INotifyPropertyChanged。
发布于 2010-02-18 04:27:06
IEditableObject on MSDN (here)的示例实现展示了一种非常简单的方法来实现它。我认为这个实现更清晰一些,但另一方面,微软可能测试了他们的:
public class MyObject : ViewModelBase, IEditableObject
{
private struct MyData
{
string Foo,
string Bar
};
private MyData Saved = new MyData()
private MyData Current = Saved;
public string Foo
{
get { return Current.Foo; }
set
{
Current.Foo = value;
OnPropertyChanged("Foo");
}
}
public string Bar
{
get { return Current.Bar; }
set
{
Current.Bar = value;
OnPropertyChanged("Bar");
}
}
public void BeginEdit()
{
if (Current == Saved)
{
Current = new MyData();
Current.Foo = Saved.Foo;
Current.Bar = Saved.Bar;
}
}
public void CancelEdit()
{
if (Current != Saved)
{
Current = Saved;
OnPropertyChanged("Foo");
OnPropertyChanged("Bar");
}
}
public void EndEdit()
{
if (Current != Saved)
{
Saved = Current;
}
}
}使用此模式时,Current始终包含对象的当前值,而不考虑其编辑状态,这使得属性访问器易于实现;IEditableObject方法只是围绕Current切换。
实现相当多的属性也是相当容易的;只需确保在添加新属性时更新BeginEdit和CancelEdit即可。
https://stackoverflow.com/questions/2282313
复制相似问题