debugging 如何将绑定错误转换为运行时异常?

jdgnovmf  于 2022-12-29  发布在  其他
关注(0)|答案(3)|浏览(109)

正如我们的项目中设置了“将警告视为错误”以尽早捕获可能的问题一样,我希望有一个运行时异常来尽早捕获它们。
我最近被这个问题咬了一口,如果有这个我会很高兴的。
能做到吗?如果能,怎么做?

p1iqtdky

p1iqtdky1#

您可以使用自己的侦听器挂钩到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>
9ceoxa92

9ceoxa922#

我实现了一个与Dean Chalk提出的解决方案非常相似的解决方案:
1.派生了引发而不是记录的TraceListener
1.已将该侦听器添加到PresentationTraceSources.DataBindingSource
请参见complete solution on GitHub,它包括一个演示应用程序和一个单元测试项目。

liwlm1x9

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对象来记录这些错误。

相关问题