XAML привязка к индексируемому элементу в свойстве привязки - PullRequest
1 голос
/ 26 августа 2009

Учитывая этот объект

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>

То, что я хотел бы сделать, это скрыть элемент People, когда есть только один человек, и вместо этого показать элемент числа 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> с первым человеком в списке людей. Я пробовал варианты "{Binding People [0] .MobilePhone}", но это не работает.

Это вообще возможно?

Ответы [ 2 ]

2 голосов
/ 26 августа 2009

Могут быть и другие способы, но я решил эту проблему в прошлом, создав конвертер значений (класс PersonIndexerConverter, который реализует IValueConverter). Преобразование может принимать параметр, который является вашим индексом. Передайте индекс как parementer в XAML. Привязка становится немного сложнее, но вы получаете свою индексацию.

1 голос
/ 02 сентября 2009

На самом деле это намного проще, если вы хотите получить только ПЕРВЫЙ предмет в коллекции. Если вы ссылаетесь на требуемое свойство, wpf автоматически выбирает значение для первого элемента в коллекции:

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

(от IanG )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...