Как передать свойство встроенного элемента управления для пути привязки? - PullRequest
2 голосов
/ 01 июня 2011

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

<Button.IsEnabled>
  <MultiBinding Converter="{x:Static app:MainControl.CanExcludeConverter}">
    <Binding Path="PageIndex" ElementName="nav_pane"/>
    <Binding Path="History" />
  </MultiBinding>
</Button.IsEnabled>

Второй параметр передается правильно, а первый - нет - независимо от того, что я делаю, я получаю только DependencyProperty.UnsetValue.Сначала у меня был PageIndex как просто свойство с уведомителями, затем я сделал это свойством зависимости, затем я попробовал несколько способов установить Binding - безуспешно.

"nav_pane" - это имя моего пользовательского элемента управления, которыйвложен в MainControl.PageIndex - это свойство зависимости NavPane.

Что мне не хватает?

Правки

1

Более длинный пример.MainControl на самом деле состоит из NavPane, и это все :-) Благодаря свойствам зависимостей, установленным в NavPane как «слоты», я могу добавлять новые элементы управления в рамке (прямоугольнике) NavPane.Вот как это начинается:

<UserControl x:Class="Worture.MainControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:app="clr-namespace:Worture"
             mc:Ignorable="d" 
             Height="Auto" Width="320" 
             BorderThickness="2" BorderBrush="Navy"  
             MouseEnter="UserControl_MouseEnter"
             IsVisibleChanged="UserControl_IsVisibleChanged"
             Loaded="UserControl_Loaded">
    <Grid Margin="4,0,4,4">
        <app:NavPane x:Name="nav_pane" 
                      OnNavigation="UpdateNavPane">
            <app:NavPane.UpperSlot>
                <Button Margin="4,0,0,0">
                    <StackPanel Orientation="Horizontal">
                        <app:AutoGreyableImage Source="/Worture;component/Images/plus.png"  Width="24" Height="24"/>
                    </StackPanel>
                    <Button.IsEnabled>
                     ...

Остальное выше.

2

Свойство Dependy в NavPane.

    public static readonly DependencyProperty PageIndexProperty =
      DependencyProperty.Register(NameOf.Get((NavPane dlg) => dlg.PageIndex),
      typeof(int?),
      typeof(NavPane),
      new UIPropertyMetadata(null));

    public int? PageIndex
    {
        get { return (int?)GetValue(PageIndexProperty); }
        set { SetValue(PageIndexProperty, value); }
    }

NameOf isхороший класс, найденный в SO, который получает имя свойства, поля и т. д. Благодаря этому я избегаю магических чисел и лучше подхожу для запутывания.

3

Я получаю UnsetValue каквходной аргумент в конвертере.PageIndex устанавливается в различных случаях (это также зависит от пользователя).Но чтобы сосредоточиться, я установил его (прямо сейчас) в null в качестве первой строки в конструкторе.Так что теоретически я должен получить такой аргумент - null (как «int?»).

1 Ответ

1 голос
/ 01 июня 2011

Скорее всего, вы неправильно добавляете кнопку в качестве логического потомка NavPane. По сути, вы должны вызывать AddLogicalChild в NavPane для каждого элемента, добавленного в вашу коллекцию UpperSlot. Вы также должны вызвать RemoveLogicalChild для всего, что удалено из вашей коллекции.

Наконец, вам нужно переопределить LogicalChildren в NavPane и включить элементы в вашу коллекцию (в дополнение к чему-либо, возвращенному базовой версией).

Если UpperSlot не является коллекцией, вам просто нужно добавить / удалить единственный элемент, к которому он относится.

Кент Бугаарт хорошо написал об этом здесь . Более подробную информацию о разрешении ElementName можно найти здесь и здесь .

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