2

我有一个看起来像这样的 TabControl:

<TabControl x:Name="tabPlaintiffs" 
                ItemsSource="{Binding CivilPaper.Plaintiffs}" 
                ContentTemplate="{DynamicResource PersonTemplate}" 
                SelectedItem="{Binding SelectedPerson, Converter={StaticResource PersonRoleToPerson}, Mode=OneWayToSource}" 
                Margin="5" />

内容模板如下所示:

<DataTemplate x:Key="PersonTemplate">
                <Grid Background="#FF4EFF00">
                </Grid>
            </DataTemplate>

在 Windows 7 上,它呈现如下: 在此处输入图像描述

在 Windows XP SP3 上,它呈现(或实际上不呈现!)如下: 在此处输入图像描述

是什么导致了差异?

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

4

2 回答 2

1

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

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

  1. 验证两台机器都使用相同的运行时。
  2. 创建一个新的空控件并一个一个地添加元素,直到它停止在 XP 上工作。可能是您正在使用的组件之一不支持它,您需要使用其他组件。
于 2013-04-03T06:30:28.057 回答
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 终止支持,我可以将它从我们支持的操作系统中删除。

于 2013-04-04T03:47:38.387 回答