Binding 是 WPF 中的一个强大的功能,但同时这又是让人很纠结的地方,因为在使用 Binding 时,经常会发生一些莫名其妙的问题,例如,编译、运行都没有 exception 抛出,界面的布局也如我们预期那样显示,但是就是不显示值。我们常常在这个问题上花费大量的时间。
通过 msdn 等资源,终于找到了如何 debug xaml 的方法,准确的说,是找到了如何将 Binding 的信息打印到 Output Window 的方法。
一种方式是通过设置 Visual Studio 中 Debugging,另一种是使用附加属性 PresentationTraceSources.TraceLevel。下面解释下如何使用这两种方法:
例如 MainWindow 中定义了一个 Property,然后在它的构造函数中将该 Property 赋值,在 MainWindow 对应的 xaml 文件中,将 TextBlock 的 Text 属性 Binding 到 MainWindow 的 Property 上。如下所示:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
LongWordText = "Demo";
}
private string _value;
public string LongWordText
{
get { return _value; }
set
{
_value = value;
OnPropertyChanged("LongWordText");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
<Grid>
<TextBlock Text="{Binding LongWordTest,ElementName=main}" />
</Grid>
运行时,在 UI 上并没有如我们预期的那样,出现 “Demo” 字符串。当然,由于我们的代码比较简短、简单,所以细心的读者肯定发现了ÿ