1

別のコードとほぼ同じコードがあります-どちらも多かれ少なかれ、まったく同じテンプレートに従っています...

<Style TargetType="{x:Type controls:LookupControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:LookupControl}">
                <controls:AutoCompleteTextBox Margin="5,2,2,2"
                                              EntityItemTemplate="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                                           Path=ItemTemplate,
                                                                           Mode=TwoWay,
                                                                           UpdateSourceTrigger=PropertyChanged}"
                                              Items="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                              Path=SearchResults}"
                                              SelectAllOnFocus="True"
                                              Text="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                             Path=Text,
                                                             Mode=TwoWay,
                                                             UpdateSourceTrigger=PropertyChanged}"
                                              Watermark="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                                  Path=Watermark,
                                                                  Mode=TwoWay}"
                                              Value="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                              Path=Value,
                                                              Mode=TwoWay,
                                                              UpdateSourceTrigger=PropertyChanged}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type controls:SomeEntityControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type controls:SomeEntityControl}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>

                    <TextBlock Grid.Row="0"
                               Margin="2"
                               Style="{DynamicResource InputTitle}"
                               Text="{Binding RelativeSource={RelativeSource TemplatedParent},
                                              Path=Label,
                                              Mode=TwoWay,
                                              UpdateSourceTrigger=PropertyChanged}" />

                    <controls:AutoCompleteTextBox Grid.Row="1"
                                                  Margin="5,2,2,2"
                                                  DisplayMemberPath="Name"
                                                  Items="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                                  Path=SomeEntities}"
                                                  SearchMemberPath="Name"
                                                  SelectAllOnFocus="True"
                                                  Text="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                                 Path=Text,
                                                                 Mode=TwoWay,
                                                                 UpdateSourceTrigger=PropertyChanged}"
                                                  Value="{Binding RelativeSource={RelativeSource TemplatedParent},
                                                                  Path=Value,
                                                                  Mode=TwoWay,
                                                                  UpdateSourceTrigger=PropertyChanged}">
                        <controls:AutoCompleteTextBox.EntityItemTemplate>
                            <DataTemplate DataType="{x:Type entities:SomeEntity}">
                                <TextBlock Text="{Binding Name}" />
                            </DataTemplate>
                        </controls:AutoCompleteTextBox.EntityItemTemplate>
                    </controls:AutoCompleteTextBox>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

それらはほとんど同じです-そして最初のものは私に問題を引き起こしているものです. Snoop ではすべてが正しくバインドされますが、何らかの理由で、(LookupControl の) Value は「ParentTemplate」ではなく「Local」にバインドされます。SomeEntityControl では、ParentTemplate に正常にバインドされています。

LookupControl の値の "AutoCompleteTextBox" は Local で null です。SomeEntityControl では、ParentTemplate です (少なくとも、まだ null ですが、何かが選択されるたびに変更されます)。

LookupControlには、Value を手動でオーバーライドして何かとして設定するものはありません。これは潜在的な問題になる可能性があります。私は何かを逃したかどうかに興味があります。TemplateBinding がどのように無視され、別のユーザーに適用されるのか理解できません...

さらに詳細を追加すると、SomeEntityControl の値は静的に SomeEntity に型付けされます。したがって、その Value プロパティは SomeEntity です。一方、それは Object 型です。オブジェクト型から文字列型に交換しようとしましたが、うまくいきませんでした。何らかの理由で、まだローカルにバインドされたままです。

(LookupControl 内)

    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(object), typeof(LookupControl), new UIPropertyMetadata(null));

(SomeEntityControl 内)

    public static readonly DependencyProperty ValueDependencyProperty =
        DependencyProperty.Register("Value", typeof(SomeEntity), typeof(SomeEntityControl), new UIPropertyMetadata(null));

何かご意見は?スタイルが正しく設定されていることは確かです...バインドする必要があることはわかっています-LookupControlのValueプロパティのトレーサー/出力ウィンドウで問題が発生していることを示すエラー/例外はありません...

TemplateParent が見つからない場合、ローカルまたは何かに戻るという奇妙なエラーが発生する可能性があるかどうか疑問に思っています...?

4

2 に答える 2

0

他の誰かがそれに出くわして、「彼は何を見つけたの?!?! 答えは何?」

コントロールを書き直すことで修正しましたが、これは XAML であり、まったく新しいものからやり直しています。最終的に、細部は肉眼とほぼ同じに見えます。ただし、今回は最小限の機能しか持たず、他のすべての「あると便利なもの」をゆっくりと (すべて同時に組み込むのではなく) 追加したことを強調したいと思います。

コードを 2 つのモニターに表示したところ、同じように見えましたが、何らかの理由で「新しい」バージョンが機能しました。残念ながら、それはおそらく誰の助けにもなりませんが、それが「答え」でした。私があまり積極的でなかったら、おそらく機能を取り除いてから、ゆっくりと再統合して問題を診断できたはずです。ただし、最初からやり直すことで、落とし穴を回避できる場合もあります。

于 2014-01-08T18:51:26.873 に答える