WPF TabControl ContentTemplate在Windows XP上的呈现方式与Windows 7不同

时间:2013-04-03 06:16:35

标签: wpf wpf-4.0

我有一个看起来像这样的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上,它呈现如下: enter image description here

在Windows XP SP3上,它渲染(或实际上不渲染!),如下所示: enter image description here

造成差异的原因是什么?

编辑 :删除了ItemsTemplate并删除了ContentTemplate中的所有数据绑定以排除各种各样的事情。

2 个答案:

答案 0 :(得分:1)

对于任何人来说都是非常困难的,即使是非常熟悉代码的人(即你)也会在这么多代码中找到错误。

我建议您通过以下方式调试您的应用程序:

  1. 验证两台计算机中是否使用了相同的运行时。
  2. 创建一个新的空控件并逐个添加元素,直到它在XP上停止工作。可能是您正在使用的某个组件不支持它,您需要使用其他组件。

答案 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终止支持,我可以从支持的操作系统中删除它。