Привязка к коллекции сводится к одному из ее свойств - PullRequest
3 голосов
/ 15 апреля 2011

Я хочу сделать что-то вроде этого:

<HierarchicalDataTemplate 
                          x:Key="BuildingTemplate"
                          ItemsSource="{Binding Path=RoomAccesses.Select(p => p.Room)}"
                          ItemTemplate="{StaticResource ZoneTemplate}">
    <TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>

Конечно, RoomAccesses.Select (p => p.Room) дает синтаксические ошибки, но вы поймете идею.Я хочу, чтобы все комнаты в объекте roomaccesses были связаны здесь.

У вас есть какие-либо идеи, как это сделать правильно?

Спасибо!

Ответы [ 4 ]

1 голос
/ 15 апреля 2011

Что еще вы можете сделать, это использовать ValueConverter, например, это простой конвертер выбора свойств:

public class SelectConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (!(value is IEnumerable)) throw new Exception("Input is not enumerable");
        IEnumerable input = ((IEnumerable)value);
        var propertyName = parameter as string;
        PropertyInfo propInfo = null;
        List<object> list = new List<object>();
        foreach (var item in input)
        {
            if (propInfo == null)
            {
                propInfo = item.GetType().GetProperty(propertyName);
                if (propInfo == null) throw new Exception(String.Format("Property \"{0}\" not found on enumerable element type", propertyName));
            }
            list.Add(propInfo.GetValue(item, null));
        }
        return list;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Пример использования XAML:

<ListBox ItemsSource="{Binding Data,
                               Converter={StaticResource SelectConverter},
                               ConverterParameter=Occupation}"/>
1 голос
/ 15 апреля 2011

Предоставьте свойство Rooms в вашем DataContext:

public IEnumerable<Room> Rooms
{
    get { return RoomAccesses.Select(p => p.Room); }
}

и свяжите с Rooms вместо RoomAccesses

1 голос
/ 15 апреля 2011

Почему бы не оставить привязку как есть, например ItemsSource = "{Binding Path = RoomAccesses}", а затем работать со свойством .Room в шаблоне данных?Я имею в виду, что с помощью PropertyPath это легко сделать.

1 голос
/ 15 апреля 2011

К чему вы привязываетесь в этом примере?

Если вы можете редактировать класс, к которому привязываетесь, вы можете добавить свойство к классу следующим образом:

public IEnumberable<string> RoomsAccessed // replace string with the type of Room
{
    get { return RoomAccesses.Select(p => p.Room); }
}

Затем обновите свой Binding Path до RoomAccessed (или как вы хотите его называть)

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