正如我们的项目中设置了“将警告视为错误”以尽早捕获可能的问题一样,我希望有一个运行时异常来尽早捕获它们。我最近被这个问题咬了一口,如果有这个我会很高兴的。能做到吗?如果能,怎么做?
p1iqtdky1#
您可以使用自己的侦听器挂钩到PresentationTraceSources集合:
PresentationTraceSources
public class BindingErrorListener : TraceListener { private Action<string> logAction; public static void Listen(Action<string> logAction) { PresentationTraceSources.DataBindingSource.Listeners .Add(new BindingErrorListener() { logAction = logAction }); } public override void Write(string message) { } public override void WriteLine(string message) { logAction(message); } }
然后用代码隐藏的方式连接起来
public partial class MainWindow : Window { public MainWindow() { BindingErrorListener.Listen(m => MessageBox.Show(m)); InitializeComponent(); DataContext = new string[] { "hello" }; } }
以下是具有绑定错误的XAML
<Grid> <TextBlock Text="{Binding BadBinding}" /> </Grid>
9ceoxa922#
我实现了一个与Dean Chalk提出的解决方案非常相似的解决方案:1.派生了引发而不是记录的TraceListener1.已将该侦听器添加到PresentationTraceSources.DataBindingSource请参见complete solution on GitHub,它包括一个演示应用程序和一个单元测试项目。
TraceListener
PresentationTraceSources.DataBindingSource
liwlm1x93#
首先将此类添加到项目中:
using System.Diagnostics; namespace WpfTestApp { public class BindingErrorListener : TraceListener { public static void Register() { PresentationTraceSources.DataBindingSource.Listeners.Add(new BindingErrorListener()); } public override void Write(string message) { } public override void WriteLine(string message) { #if DEBUG throw new System.Exception(message); #endif } } }
然后调用App.xaml.cs类中的Register方法:
public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); BindingErrorListener.Register(); // ... } }
这样,(通过抛出异常)如果你有任何绑定错误,那么**你会在第一时间注意到这些错误,也就是说,当你启动(F5)你的应用程序时。如果你愿意,你可以通过在BindingErrorListener构造函数中注入你的logger对象来记录这些错误。
BindingErrorListener
3条答案
按热度按时间p1iqtdky1#
您可以使用自己的侦听器挂钩到
PresentationTraceSources
集合:然后用代码隐藏的方式连接起来
以下是具有绑定错误的XAML
9ceoxa922#
我实现了一个与Dean Chalk提出的解决方案非常相似的解决方案:
1.派生了引发而不是记录的
TraceListener
1.已将该侦听器添加到
PresentationTraceSources.DataBindingSource
请参见complete solution on GitHub,它包括一个演示应用程序和一个单元测试项目。
liwlm1x93#
首先将此类添加到项目中:
然后调用App.xaml.cs类中的Register方法:
这样,(通过抛出异常)如果你有任何绑定错误,那么**你会在第一时间注意到这些错误,也就是说,当你启动(F5)你的应用程序时。如果你愿意,你可以通过在
BindingErrorListener
构造函数中注入你的logger对象来记录这些错误。