2

次のような 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 では、次のようにレンダリングされます (または実際にはレンダリングされません!)。 ここに画像の説明を入力

違いの原因は何ですか?

EDIT : ItemsTemplate を削除し、ContentTemplate のすべてのデータバインディングを削除して、あらゆる種類のものを除外しました。

4

2 に答える 2

1

誰にとっても、コードに精通している人 (つまり、あなた) でさえ、これだけ多くのコードの中からバグを見つけるのは非常に困難です。

次の方法でアプリケーションをデバッグすることをお勧めします。

  1. 両方のマシンで同じランタイムが使用されていることを確認します。
  2. 新しい空のコントロールを作成し、XP で動作しなくなるまで要素を 1 つずつ追加します。使用しているコンポーネントの 1 つがそれをサポートしていない可能性があり、別のものを使用する必要があります。
于 2013-04-03T06:30:28.057 に答える
0

最終的に、Windows 7 は Windows XP とは異なる方法で ValueConverter を処理することが判明しました。私が削除した場合:

SelectedItem="{Binding SelectedPerson, Converter={StaticResource PersonRoleToPerson}, Mode=OneWayToSource}"

それから私はすべての適切なテンプレートを手に入れました。問題は ValueConverter にありましたが、Windows XP では複数回発生していましたが、Windows 7 では、基になるコレクションが変更を通知したときに 1 回しか発生しませんでした (当然のことです!)。

私の 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 のサポートが終了し、サポート対象の OS から削除できるまでの日数をカウント ダウンしています。

于 2013-04-04T03:47:38.387 に答える