【发布时间】:2014-04-28 15:38:50
【问题描述】:
首先,这是一个使用 MVVM 的向导控件的简化版本。如下所述,该问题更容易重现
经过大量缩小后,我已经解决了由于 WPF ContentControl 导致的代码中的无限异常。但是,除了尝试捕获所有可能的实例化代码之外,我还没有弄清楚如何处理它。这是重现此情况的示例代码...任何有关如何防止此无限异常发生的帮助将不胜感激。
其他详情
总结一下,问题是如果内容控件改变了它的内容,被加载的东西抛出异常,那么它就会抛出异常,然后重试加载,导致一次又一次的抛出。
MainWindow.xaml
<Window x:Class="WpfApplication8.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Name ="Main">
<Grid>
<ContentControl Name="bar" Content="{Binding ElementName=Main, Path=foo}"/>
<Button Click="ButtonBase_OnClick" Margin="20" Width="50"/>
</Grid>
</Window>
MainWindow.xaml.cs
public partial class MainWindow : Window, INotifyPropertyChanged
{
private UserControl _foo;
public UserControl foo
{
get { return _foo; }
set { _foo = value; OnPropertyChanged("foo"); }
}
public MainWindow()
{
InitializeComponent();
foo = new UserControl1();
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
foo = new UserControl2();
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
UserControl1 为空白且全部默认
UserControl2.xaml.cs
public UserControl2()
{
InitializeComponent();
throw new Exception();
}
【问题讨论】:
-
您能否详细说明 ContentControl 如何导致无限循环?
-
删除所有这些并创建一个适当的 ViewModel 并从 UI 中删除不属于它的
INotifyPropertyChanged并使用适当的 DataBinding 和 DataTemplates,您的所有问题都会神奇地消失。 -
“无限异常”是什么意思?无限循环? StackOverflowException?
-
@YuvalItzchakov 我添加了其他细节,希望有助于澄清。即使出现异常,也会不断重试渲染的是内容更改渲染。
-
@HighCore 这是简化版本,但这发生在使用 DataBindings 和 ViewModels 的生产代码中。它是一个 WizardFramework,随着步骤的进行,用户控件会被替换掉。