Where is the IsEmpty reference/member in this XAML code?

孤街浪徒 提交于 2020-05-06 19:54:13

问题


I cannot understand where the IsEmpty comes from in this snippet of code (Path=Text.IsEmpty) (about a watermark TextBox):

<Grid Grid.Row="0" Background="{StaticResource brushWatermarkBackground}" 
                   Style="{StaticResource EntryFieldStyle}" >
    <TextBlock Margin="5,2" Text="Type to search ..." Foreground="Gray"
               Visibility="{Binding ElementName=entry, Path=Text.IsEmpty, 
                          Converter={StaticResource BooleanToVisibilityConverter}}"/>
    <TextBox Name="entry" Background="Transparent"/>
</Grid>

You can see a string does not have any IsEmpty property. A DependencyProperty also does not have any IsEmpty member. I've even tried searching the IsEmpty in the Object Browser window but there was not any relevant result explaining the code.

Could you explain to me the IsEmpty reference here? (Any reference link about it is great).


回答1:


IsEmpty is being resolved from CollectionView.IsEmpty

how?

I applied high tracing for the binding

Visibility="{Binding ElementName=entry,
                     PresentationTraceSources.TraceLevel=High, 
                     Path=Text.IsEmpty, 
                     Converter={StaticResource BooleanToVisibilityConverter}}"

and here is the result

System.Windows.Data Warning: 56 : Created BindingExpression (hash=40147308) for Binding (hash=39658150)
System.Windows.Data Warning: 58 :   Path: 'Text.IsEmpty'
System.Windows.Data Warning: 60 : BindingExpression (hash=40147308): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=40147308): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=40147308): Attach to System.Windows.Controls.TextBlock.Visibility (hash=2939094)
System.Windows.Data Warning: 67 : BindingExpression (hash=40147308): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=40147308): Found data context element: <null> (OK)
System.Windows.Data Warning: 74 :     Lookup name entry:  queried TextBlock (hash=2939094)
System.Windows.Data Warning: 65 : BindingExpression (hash=40147308): Resolve source deferred
System.Windows.Data Warning: 67 : BindingExpression (hash=40147308): Resolving source 
System.Windows.Data Warning: 70 : BindingExpression (hash=40147308): Found data context element: <null> (OK)
System.Windows.Data Warning: 74 :     Lookup name entry:  queried TextBlock (hash=2939094)
System.Windows.Data Warning: 78 : BindingExpression (hash=40147308): Activate with root item TextBox (hash=46768536)
System.Windows.Data Warning: 108 : BindingExpression (hash=40147308):   At level 0 - for TextBox.Text found accessor DependencyProperty(Text)
System.Windows.Data Warning: 104 : BindingExpression (hash=40147308): Replace item at level 0 with TextBox (hash=46768536), using accessor DependencyProperty(Text)
System.Windows.Data Warning: 101 : BindingExpression (hash=40147308): GetValue at level 0 from TextBox (hash=46768536) using DependencyProperty(Text): ''
System.Windows.Data Warning: 108 : BindingExpression (hash=40147308):   At level 1 - for String.IsEmpty found accessor <null>
System.Windows.Data Warning: 108 : BindingExpression (hash=40147308):   At level 1 - for EnumerableCollectionView.IsEmpty found accessor RuntimePropertyInfo(IsEmpty)
System.Windows.Data Warning: 104 : BindingExpression (hash=40147308): Replace item at level 1 with EnumerableCollectionView (hash=40847598), using accessor RuntimePropertyInfo(IsEmpty)
System.Windows.Data Warning: 101 : BindingExpression (hash=40147308): GetValue at level 1 from EnumerableCollectionView (hash=40847598) using RuntimePropertyInfo(IsEmpty): 'True'
System.Windows.Data Warning: 80 : BindingExpression (hash=40147308): TransferValue - got raw value 'True'
System.Windows.Data Warning: 82 : BindingExpression (hash=40147308): TransferValue - user's converter produced 'Visible'
System.Windows.Data Warning: 89 : BindingExpression (hash=40147308): TransferValue - using final value 'Visible'

interesting lines from the above trace

System.Windows.Data Warning: 108 : BindingExpression (hash=40147308):   At level 1 - for String.IsEmpty found accessor <null>
System.Windows.Data Warning: 108 : BindingExpression (hash=40147308):   At level 1 - for EnumerableCollectionView.IsEmpty found accessor RuntimePropertyInfo(IsEmpty)

so you can see that indeed type String does not have IsEmpty

for String.IsEmpty found accessor <null>

but the view for the string is an EnumerableCollectionView which does have IsEmpty and the binding resolved to the same

for EnumerableCollectionView.IsEmpty found accessor RuntimePropertyInfo(IsEmpty)


来源:https://stackoverflow.com/questions/25699810/where-is-the-isempty-reference-member-in-this-xaml-code

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!