Как может свойство объекта во внутреннем ItemsControl связываться со свойством объекта во внешнем ItemsControl? - PullRequest
2 голосов
/ 23 ноября 2011

Название может звучать запутанно, но терпите меня.

У меня есть комнаты, в которых есть обитатели:

public class Room
{
    public string Name { get; set; }
    public List<Person> Occupants { get; set; }
    public bool AreOccupantsEditable { get; set; }
}

public class Person
{
    public string Name { get; set; }
}

Вот массив комнат:

<ResourceDictionary>
    <x:Array x:Key="Rooms" Type="local:Room">
        <local:Room Name="Happy Room" AreOccupantsEditable="True">
            <local:Room.Occupants>
                <local:Person Name="Mindy" />
            </local:Room.Occupants>
        </local:Room>
        <local:Room Name="Sad Room" AreOccupantsEditable="True">
            <local:Room.Occupants>
                <local:Person Name="Bob" />
                <local:Person Name="Jane" />
            </local:Room.Occupants>
        </local:Room>
        <local:Room Name="Kill Room" AreOccupantsEditable="False">
            <local:Room.Occupants>
                <local:Person Name="Mork" />
                <local:Person Name="Dave" />
                <local:Person Name="Ryan" />
            </local:Room.Occupants>
        </local:Room>
    </x:Array>
</ResourceDictionary>

Вот ItemsControl в ItemsControl, чтобы отобразить комнаты и их жителей:

<ItemsControl ItemsSource="{Binding Source={StaticResource Rooms}}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <!-- room name -->
                <TextBlock Text="{Binding Path=Name}" />
                <ItemsControl ItemsSource="{Binding Path=Occupants}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <!-- occupant name -->
                            <TextBox Text="{Binding Path=Name}" Margin="20,0,0,0" IsEnabled="{Binding ???}" />
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Без Лица, имеющего ссылку на Комнату, как я могу связать свойство IsEnabled TextBox со свойством AreOccupantsEditable комнаты aЧеловек в?

Если это поможет, вот пример проекта: http://dl.dropbox.com/u/4220513/ItemsControl-Binding.zip

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011

Вы можете использовать RelativeSource для доступа к внешнему DataContext:

IsEnabled="{Binding Path=DataContext.AreOccupantsEditable, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"
0 голосов
/ 23 ноября 2011

Вы также можете использовать свойство IsEnabled itemControl of Occupants, чтобы отключить весь itemControl

<ItemsControl ItemsSource="{Binding Path=Occupants}" IsEnabled="{Binding Path=AreOccupantsEditable}">
...