调试WPF数据绑定的几种方法
最近在帮一些小伙伴解决问题时,遇到了各种奇奇怪怪的问题。
比较典型的包括
命名空间错误:如System.Drawing.Brushes类型和System.Windows.Media.Brushes类型错误使用,导致在Converter中,颜色转换不生效。
数据绑定错误:这个导致的原因比较多,所以这里我们总结一下如何调试数据绑定。
1、使用Visual Studio的XAML绑定失败窗口
假设我们定义了一个MyProperty属性
1 public class MainWindowViewModel : INotifyPropertyChanged 2 { 3 private string myProperty; 4 5 public string MyProperty 6 { 7 get => myProperty; 8 set 9 { 10 myProperty = value; 11 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("MyProperty")); 12 } 13 } 14 15 public event PropertyChangedEventHandler PropertyChanged; 16 }
在界面上进行绑定,因为拼写错误,将MyProperty写成了MyProprety
1 <Grid> 2 <Label Content="{Binding MyProprety}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="30"></Label> 3 </Grid>
正常运行时,会发现界面没有内容显示,调试时发现属性赋值又正常,这个时候我们可以借助XAML绑定失败窗口查看输出信息
选择【调试】-》【窗口】-》【XAML绑定失败】菜单,打开XAML绑定失败窗口。
错误信息如下:
2、将绑定错误输出到文本文件
首先我们打开App.config,在configuration节点下增加如下内容
1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 4 ...... 5 6 <!--诊断信息输出--> 7 <system.diagnostics> 8 <sources> 9 <source name="System.Windows.Data" switchName="SourceSwitch"> 10 <listeners> 11 <add name="textFileListener" /> 12 </listeners> 13 </source> 14 </sources> 15 <switches> 16 <add name="SourceSwitch" value="All" /> 17 </switches> 18 <sharedListeners> 19 <add name="textFileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="DebugTrace.txt" /> 20 </sharedListeners> 21 <trace autoflush="true" indentsize="4" /> 22 </system.diagnostics> 23 </configuration>
上面的配置可以创建一个跟踪源,它可以捕获从 System.Windows.Data命名空间中的调试信息。
每个跟踪源都可配置为输出两种级别的调试信息:警告(Warning)、错误(Error)或两者(ALL)。
每个跟踪源还可以有一个或多个监听器,作为调试输出的目标。
我们这里配置了一个System.Diagnostics.TextWriterTraceListener 将错误输出到 DebugTrace.txt 文件,也可以把调试信息输出到控制台或 XML 文件。
应用程序运行时,在运行目录下会生成一个DebugTrace.txt 文件,它里面记录了包括数据绑定的错误日志和其它任何程序运行时的错误信息。
说明:
1、除了TextWriterTraceListener还可以使用以下几种Listener:
3、使用PresentationTraceSources.TraceLevel附加属性
使用方法如下:
1、引入XAML命名空间
1 xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
2、在绑定时使用,通过TraceLevel来指定追踪级别
1 <Grid> 2 <Label Content="{Binding MyProprety,diagnostics:PresentationTraceSources.TraceLevel=High}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="30"></Label> 3 </Grid>
使用PresentationTraceSources.TraceLevel附加属性,并将Level设置为High。
在Visual Studio中调试时,输出窗口可以看到非常详细的数据绑定信息输出,如下所示:
4、使用ValueConverter
值转换器的作用是在数据呈现到UI之前,对数据进行自定义处理。
所以如果我们需要对数据进行调试,可以增加一个Converter,并在Converter中断点,这样就能调用数据的正确性。
1 public class MyValueConverter : IValueConverter 2 { 3 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 4 { 5 return value; 6 } 7 8 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 9 { 10 return value; 11 } 12 }