У меня есть пользовательский элемент управления с вложенным (пользовательским) элементом управления.Я хотел бы получить свойство из вложенного элемента управления и передать его преобразователю основного элемента управления.Вот мой код:
<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?»).