2009-08-26 60 views
1

鉴于此对象XAML绑定到索引的元素结合

class Contact 
{ 
    public IEnumerable<Person> People { get; } 
    public string PhoneNumber { get; } 
} 

class Person 
{ 
    public string MobileNumber { get; } 
} 

的财产和下面的布局

<Contact> 
    <PhoneNumber/> 
    <SinglePerson.MobileNumber/> 
    <People> 
     <MobileNumber /> 
    </People> 
<Contact> 

我希望做的是隐藏在人们元素只有一个时人,并显示SinglePerson.Mobile号码元素。

隐藏是相当容易:

<Style.Triggers> 
    <DataTrigger Binding="{Binding Path=People.Count}" Value="1"> 
     <Setter Property="Visibility" Value="Collapsed" /> 
    </DataTrigger> 
</Style.Triggers> 

显示稍微有些棘手:

<Setter Property="Visibility" Value="Collapsed"/> 
<Style.Triggers> 
    <DataTrigger Binding="{Binding Path=People.Count}" Value="1"> 
     <Setter Property="Visibility" Value="Visible" /> 
    </DataTrigger> 
</Style.Triggers> 

,我可以不知道如何做的事情是对<SinglePerson.MobileNumber>文本结合第一人员列表中的人员。我已经试过“{结合人物[0] .MobilePhone}”的变种,但不起作用。

这有可能吗?

回答

1

它实际上是容易得多,如果你只是想获得一个集合中的第一项。如果引用所需的财产,WPF会自动选择集合中的第一个元素的值:

<DataTrigger Binding="{Binding People/MobileNumber}" Value=""> 
    <Setter Property="Visibility" Value="Collapsed" /> 
</DataTrigger> 

(从IanG

2

可能有其他的方式,但我已经在过去通过创建一个值转换器(一个名为PersonIndexerConverter实现的IValueConverter类)解决了这个。转换可以采用一个参数,这是您的索引。通过该指数作为一个XAML parementer。的结合变得稍微复杂一些,但你得到你的索引。

+0

酷,工程确定对我来说,我做了一个FirstPersonMobileConverter(我可以已经决定在属性名作为参数来传递,这将是下一个版本)。 – Benjol 2009-08-26 10:30:45