与ObservableAsPropertyHelper混合崩溃

时间:2014-05-17 14:05:17

标签: c# wpf xaml blend

当我尝试加载在Visual Studio 2013中开发的WPF解决方案时,Microsoft Blend 2013立即崩溃。我收到的(缩写)错误消息是: System.Exception:对象(通常是ObservableAsPropertyHelper)上发生了一个OnError会打破绑定或命令。要防止这种情况,请订阅对象的ThrownExceptions属性---> System.InvalidOperationException:在应用程序配置文件中找不到名为“RecipeModelContainer”的连接字符串。

应用程序构建正常并在我运行时执行。在此特定问题开始之前,Blend始终显示缺少的连接字符串消息;当我在我的代码隐藏中设置DataContext时,这个消息就产生了,并且自从我将DataContext引用传递给我的XAML以来一直存在。无论如何,连接字符串绝对是存在的。

我正在尝试使用ReactiveUI来开发用户控件,并使用ObservableAsPropertyHelper属性。这是属性:

private ObservableAsPropertyHelper<IList<string>> _matches;
public IList<string> Matches
{
    get
    {
        return _matches.Value;
    }
}

...这是我的ViewModel构造函数中的相关内容:

var searchTerms = this.ObservableForProperty(x => x.IngredientFilter)
                   .Value()
                   .Throttle(TimeSpan.FromSeconds(0.2));
var searchResults = searchTerms.SelectMany(st => SearchIngredients(st));
_matches = searchResults.ToProperty(this, x => x.Matches);

对Reactive Extensions相对不熟悉并且混淆为什么Blend关心我的app.config文件中的内容,我不知道如何实现推荐的错误处理或以其他方式管理此问题。我试过清理我的解决方案以及删除.suo文件。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我已经为这个问题确定了两个解决方案。第一个根据Blend错误消息建议实现ThrownException处理:

_matches.ThrownExceptions.Subscribe(e => MessageBox.Show(e.Message));

这将在Blend启动时启动两个MessageBox窗口,读取&#34;在应用程序配置文件&#34;中找不到名为RecipeModelContainer的连接字符串,但至少Blend不会崩溃。

其次,事实证明该问题是由于我的异步SearchIngredients方法零延迟造成的,该方法基本上查询Entity Framework DbContext对象的匹配项。我添加await Task.Delay(0)只是为了伪造searchTerms.SelectMany的异步方法(如果方法不是异步,则应用程序挂起)。它仍然不清楚这与app.config文件有什么关系,但当我改为非零延迟时,问题就完全消失了。