Привязка имущества правнука к предку

Я даже не знаю, как это выразить, поэтому мне очень жаль, если название сбивает с толку. Мой XAML (упрощенный) выглядит так:

<UserControl x:Class="PBA.Application.Client.UserControls.UserControls.FreqReserve.OverView" xmlns:FreqReserve="clr-namespace:PBA.Application.Client.UserControls.UserControls.FreqReserve">
...
    <DockPanel>
        <UserControls:LegendControl>
            <UserControls:LegendControl.Items>
                <UserControls:LegendItem Visibility="{Binding Path=IsDirtyVisible, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type FreqReserve:OverView}}, Converter={StaticResource btvc}}" Identifier="Pink" Text="Ikke sendt"></UserControls:LegendItem>
                <UserControls:LegendItem Identifier="Yellow" Text="Sendt"></UserControls:LegendItem>
                <UserControls:LegendItem Identifier="LightGreen" Text="Accepteret"></UserControls:LegendItem>
                <UserControls:LegendItem Identifier="White" Text="Ikke accepteret"></UserControls:LegendItem>
            </UserControls:LegendControl.Items>
        </UserControls:LegendControl>
    </DockPanel>
</UserControl>

где список LegendItem создан по шаблону внутри элемента управления legend.

Выражение привязки завершается с ошибкой System.Windows.Data: 4. Вместо этого я пытался использовать имя элемента с теми же результатами. Я предполагаю, что это как-то связано с тем, что LegendItems на самом деле не находятся непосредственно в визуальном дереве, но я понятия не имею (знаю, новичок в WPF). Что я делаю не так?


person hhravn    schedule 13.10.2010    source источник


Ответы (1)


У вас опечатка в AncestorType. Вы хотите сказать FreqReserve.OverView. Кроме того, вам придется ссылаться на пространство имен библиотеки, как определено в вашем UserControl.

Что-то вроде этого:

<UserControl x:Class="PBA.Application.Client.UserControls.UserControls.FreqReserve.OverView"
             ...
             xmlns:local="clr-namespace:PBA.Application.Client.UserControls.UserControls">

    ...
       <DockPanel>
        <UserControls:LegendControl>
            <UserControls:LegendControl.Items>
                <UserControls:LegendItem IsVisible="{Binding Path=IsDirtyVisible, 
                    RelativeSource={RelativeSource Mode=FindAncestor, 
                                    AncestorType={x:Type local:FreqReserve.OverView}}}" 
                    Identifier="Pink" 
                    Text="Ikke sendt"></UserControls:LegendItem>

               ....         

        </UserControls:LegendControl>
    </DockPanel>
</UserControl>

Обратите внимание, что вам нужно указать правильное пространство имен для «локального» объявления, но вы должны получить его от IntelliSense, если вы не уверены, каким оно должно быть.

person Wonko the Sane    schedule 13.10.2010
comment
Извиняюсь. Зашли слишком далеко, удаляя лишнее, и написали немного кода вручную, так как его больше нет в реальном коде. Фрагмент обновлен, чтобы лучше отражать фактический код. - person hhravn; 13.10.2010
comment
Давайте начнем с простого и пойдем дальше. Является ли IsDirtyVisible свойством элемента управления OverView? - person Wonko the Sane; 13.10.2010
comment
Да, это обернутое свойство зависимости. - person hhravn; 13.10.2010
comment
Как выглядит это свойство и DP? - person Wonko the Sane; 13.10.2010
comment
частный статический только для чтения DependencyProperty _isDirtyVisibleProperty = DependencyProperty.Register(IsDirtyVisible, typeof (bool), typeof (OverView), new PropertyMetadata (true)); public bool IsDirtyVisible { get { return (bool) GetValue (_isDirtyVisibleProperty); } установить { SetValue (_isDirtyVisibleProperty, значение); } } - person hhravn; 14.10.2010