3

我最近在我们的代码中添加了一个 OneWayToSource 绑定到视图模型中的只读属性。当时我不知道.Net 4的变化,当没有getter时这会导致异常:

<Popup IsOpen="{Binding IsPopupOpen, Mode=OneWayToSource}" />
...
public bool IsPopupOpen
{
    set
    {
        // do something with value
    }
}

问题是,这段代码可以在我的电脑上运行而不会引发异常。完全相同的可执行文件在其他机器上不起作用 - 弹出窗口没有打开,并且引发了预期的异常。我无法弄清楚这怎么可能?该项目针对.Net FW 4。

我确保清除我的 bin 文件夹并重建,但它仍然在我的机器上毫无例外地工作,而不是在其他机器上。

我知道如何“解决”这个问题——只需在属性中添加一个吸气剂。但是我需要弄清楚程序在不同机器上的运行方式有何不同,因为这可能会导致其他严重问题......

编辑:

这让我发疯!我使用 Snoop WPF 实用程序查看我的弹出窗口,似乎根本没有绑定到 IsOpen(绑定是 XAML 的新增功能)。但是,如果我将调试器附加到应用程序并在绑定属性的设置器内设置断点,它会命中我的断点!

4

1 回答 1

2

有点猜测。

有可能在 net 4.0 中进行此更改后,他们决定在 .net 4.5 中使其更加一致:如果 getter 存在,则将属性重新读回 UI,否则不会发生任何可怕的事情并且不会引发异常。

如果是这样并且您安装了 .net 4.5,您可以获得这种行为而不是预期的行为。
我们遇到过 4.5 的更新以静默方式传播到 4.0 的情况。

于 2013-02-19T21:47:59.830 回答