我正在开发一个Silverlight LoB应用程序,设计人员希望它有一个标签界面,类似于Visual Studio的界面(我们可能会使用Telerik Rad控件进行对接选项卡).完成原型后,界面到目前为止运行良好,但我在思考如何在MVVM项目中实现撤消/重做功能时遇到了问题.
撤消/重做功能必须:
通常,我会使用命令模式,但我不确定如何将其应用于MVVM.
我已经使用命令和绑定来获得视图和视图模型的理想松散耦合,但它使撤消/重做变得更加棘手,因为视图模型没有任何视图概念和状态收到命令或绑定属性更改时的视图.似乎我需要某种服务跟踪,只要用户执行一些可撤消操作并获得状态以便以后恢复,哪个视图就处于活动状态.
对MVVM中实现撤消/重做的最佳实践有什么共识?我非常感兴趣地看看丹尼尔沃恩在他的钙项目中如何做到这一点; Blend显然是使用MVVM模式编写的,它的行为就像我想要的应用程序一样,如果MS解释他们是如何做到的,那就太棒了!
更新:我在完全测试之前检查了答案它仍然无效.我更新了下面的代码,所以你应该只能粘贴到一个空的WinForms项目,它应该编译.
更新:我发现如果我将ComboBox上的选定项目更改为任何其他项目,它现在表现得如预期的那样(在我的代码下面,我将从test1切换到test2).由于我还没有收到任何答案,我将问题改为此.
为什么在显示我对基础数据源所做的更改之前,我必须更改组合框中的其他项?
这是一个快速测试案例.
test1为test1asdftxtBroken中的文本test2为test2asdftxtBroken中的文本test1下拉列表中的第一个项目test1test1文本框显示test1asdftest1asdtest1asd除了在幕后更改所选项目的负载并将其更改回来(这看起来像是这样的黑客)我该如何解决这个问题?
我有一个组合框数据绑定到一个BindingSource绑定List<Holder>它有Holder.Name它的显示值.我也有一个绑定的文本框,Holder.Name但如果我更改文本框中的文本,它将不会更改组合框中显示的内容.更改所选项目并更改后退将在文本框中显示更新的文本,但仍将在组合框中显示旧值.如何在组合框中更新项目?
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace Sandbox_Form
{
public class Form1 : Form
{
public Form1()
{
InitializeComponent();
lstBroken = new BindingList<Holder>();
lstBroken.Add(new Holder("test1"));
lstBroken.Add(new Holder("test2"));
bsBroken = new BindingSource(lstBroken, null);
cmbBroken.DataSource = bsBroken;
cmbBroken.DisplayMember = "Name";
cmbBroken.SelectedIndex …Run Code Online (Sandbox Code Playgroud) 鉴于Reactive Extensions(Rx)框架提供的可组合事件的好处,我想知道我的类是否应该停止推送.NET事件,而是暴露Rx可观察量.
例如,使用标准.NET事件获取以下类:
public class Foo
{
private int progress;
public event EventHandler ProgressChanged;
public int Progress
{
get { return this.progress; }
set
{
if (this.progress != value)
{
this.progress = value;
// Raise the event while checking for no subscribers and preventing unsubscription race condition.
var progressChanged = this.ProgressChanged;
if (progressChanged != null)
{
progressChanged(this, new EventArgs());
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
很多单调的管道.
这个类可以使用某种observable来替换这个功能:
public class Foo
{
public Foo()
{
this.Progress = some new observable; …Run Code Online (Sandbox Code Playgroud) 将指针转换为int并稍后再返回指针是否安全?
如果我们知道指针是否为32位长且int是32位长怎么样?
long* juggle(long* p) {
static_assert(sizeof(long*) == sizeof(int));
int v = reinterpret_cast<int>(p); // or if sizeof(*)==8 choose long here
do_some_math(v); // prevent compiler from optimizing
return reinterpret_cast<long*>(v);
}
int main() {
long* stuff = new long(42);
long* ffuts = juggle(stuff);
std::cout << "Is this always 42? " << *ffuts << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这是否包含在标准中?
在具有许多类的C++多线程应用程序中,我试图找出定义全局变量的方法
C样式,在任何一个源文件中将其定义为全局,在头部中将其定义为extern,该头部包含在访问此变量的类中.
编写一个Singleton类,它包含这些全局变量并公开set/get方法来写入变量.
通过第二种方法,可以以集中方式而不是第一种方法通过锁来控制多线程访问.
有更多更好的方法吗?
在WordPress 2.5及更高版本中,有一个内置的Gallery功能,允许选择将图像库添加到WordPress博客上的帖子或页面.(参考:http://codex.wordpress.org/Gallery_Shortcode)
您可以使用size选项指定要显示的缩略图大小.有效值包括"thumbnail","medium","large"和"full".默认为"缩略图".可以在WordPress管理面板中配置"缩略图","中"和"大"图像的大小.
即. [gallery size="medium"]
我的问题:我正在尝试破解[gallery]短代码,以便在输入时允许自定义大小 - 而不是尝试通过管理面板执行此操作.我想用类似的东西[gallery size="145x160"].
而不是下载一个膨胀的插件,我宁愿使用已经存在的东西,我不知道我需要在我的文件结构中进行哪些更改.我对PHP很熟悉,但我担心我会做出改变,然后当我更新WP的未来版本时,它会覆盖我在运动中设置的内容.
有人可以帮我解决这个问题吗?
非常感谢你!
我设计了一个具有两个实体的实体数据模型,在这两个实体之间存在多对多关系.当我自动生成SQL代码以生成此模型的数据库时,它生成了一个表(两列)来跟踪这种多对多关联.但是,此表在两列上都有一个PRIMARY KEY NONCLUSTERED.
既然我希望这个可以在SQL Azure上工作,它不喜欢只有非聚簇索引的表,我想知道是否有一种很好的方法来告诉代码生成生成聚簇索引?谢谢!
我找到了 mysql_insert_id 函数来检索最后一个自动生成的 ID。
我应该使用 mysql_insert_id +1 添加新 ID 还是需要添加新的唯一 ID?
我正在尝试一个实验性的Rails项目并销毁记录3(ID == 3),所以现在有记录1,2,4和5.
有没有办法重新填充此表,记录ID从1到5?(这是使用mysql)
我可以用
if Item.exists?(i)
item = Item.find(i)
else
item = Item.new
end
# set some values
item.name = "haha" + i
item.save
Run Code Online (Sandbox Code Playgroud)
Item.new() 是用新的自动增量记录ID创建新记录(在这种情况下为6),但是之前删除的记录是什么?
我对MySQL索引的工作方式非常感兴趣,更具体地说,他们如何在不扫描整个表的情况下返回所请求的数据?
我知道,这是偏离主题的,但如果有人可以向我详细解释这一点,我将非常非常感谢.