我有一个看起来像这样的TabControl:
<TabControl x:Name="tabPlaintiffs"
ItemsSource="{Binding CivilPaper.Plaintiffs}"
ContentTemplate="{DynamicResource PersonTemplate}"
SelectedItem="{Binding SelectedPerson, Converter={StaticResource PersonRoleToPerson}, Mode=OneWayToSource}"
Margin="5" />
ContentTemplate看起来像这样:
<DataTemplate x:Key="PersonTemplate">
<Grid Background="#FF4EFF00">
</Grid>
</DataTemplate>
在Windows 7上,它呈现如下:
在Windows XP SP3上,它渲染(或实际上不渲染!),如下所示:
造成差异的原因是什么?
编辑 :删除了ItemsTemplate并删除了ContentTemplate中的所有数据绑定以排除各种各样的事情。
答案 0 :(得分:1)
对于任何人来说都是非常困难的,即使是非常熟悉代码的人(即你)也会在这么多代码中找到错误。
我建议您通过以下方式调试您的应用程序:
答案 1 :(得分:0)
最终,事实证明,Windows 7处理ValueConverter的方式与Windows XP不同。如果我删除了:
SelectedItem="{Binding SelectedPerson, Converter={StaticResource PersonRoleToPerson}, Mode=OneWayToSource}"
然后我得到了所有合适的模板。问题出现在ValueConverter中,虽然Windows XP多次触发它,而Windows 7只在底层集合通知它发生变化时才触发它(因为它应该!)
我的ValueConverter最初在Convert和ConvertBack中都返回null(因为它是OneWayToSource我只需要ConvertBack)。如果任一方法不满足对象的类型检查,则返回null。我现在相信这是一种不好的做法。相反,如果你完全失败,它应该最终返回DependencyProperty.UnsetValue:
public class PlaintiffRoleToPerson : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var plaintiff = value as Plaintiff;
if (plaintiff != null)
{
return plaintiff.Person;
}
return DependencyProperty.UnsetValue;
}
}
为什么Windows 7的处理方式与Windows XP的处理方式不同仍然是一个谜,但我现在一切正常。我倒计时直到Windows XP终止支持,我可以从支持的操作系统中删除它。