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 中正确绑定,但由于某种原因,Value(在 LookupControl 上)绑定到“Local”而不是“ParentTemplate”。在 SomeEntityControl 中,它成功绑定到 ParentTemplate。

LookupControl 的值中的“AutoCompleteTextBox”是 Local 和 null。在 SomeEntityControl 中,它是 ParentTemplate(至少仍然为 null ——但只要选择了某些东西,它就会改变)。

LookupControl中没有任何内容可以手动覆盖 Value 并将其设置为任何内容,这可能是一个潜在问题。我只是好奇我是否错过了什么。我不明白 TemplateBinding 如何被一个人忽略并被另一个人应用......

为了添加更多细节,SomeEntityControl 的值被静态输入到 SomeEntity——因此其上的 Value 属性是 SomeEntity。另一方面,它是对象类型。我尝试从类型 Object 交换到 string,但没有运气 - 由于某种原因,它仍然在本地绑定。

(在 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 属性的 Tracer/Output 窗口中出现问题......

我想知道是否存在一个奇怪的错误,即如果找不到 TemplateParent 它会恢复为本地或其他东西......?

4

2 回答 2

0

我只是想跟进解决方案,因为其他人可能遇到了它并想知道,“他发现了什么?!?!答案是什么?”

我通过重写控件和它的 XAML 来修复它,重新开始。最后,细节看起来几乎与肉眼完全相同。不过,我想强调的是,这一次,我的功能很少,并且慢慢地添加了所有其他“不错的”(而不是同时合并它们)。

我把代码放在两台显示器上,它们看起来一样……但出于某种原因,“新”版本可以工作。不幸的是,这可能对任何人都没有帮助,但它是“答案”。如果我不那么热心,我可能会剥离功能,然后慢慢将其重新集成以诊断问题。有时,从头开始可以帮助您避免陷阱。

于 2014-01-08T18:51:26.873 回答
0

以防万一像我这样的其他人偶然发现这篇文章。这很可能不是 XAML 的问题,而是调用依赖属性设置器的内部代码。对此类内部“setter”使用“SetCurrentValue”不应影响值源。

感谢 Sean 为我指明了正确的方向: https ://wpf.2000things.com/2010/12/06/147-use-setcurrentvalue-when-you-want-to-set-a-dependency-property-value-来自控制内部/

于 2016-05-31T15:57:11.273 回答